【问题标题】:django template tag not getting invoked more than once in javascript functiondjango模板标签在javascript函数中没有被多次调用
【发布时间】:2019-11-13 04:39:26
【问题描述】:

在我的 django 应用程序中,我创建了一个模板标记函数,它生成一个随机数,我将其作为随机 ID 分配给以编程方式生成的元素。

 import os
 import random
 from django import template

 register = template.Library()

 @register.tag(name="randomgen")
 def randomgen(parser, token):
     items = []
     bits = token.split_contents()
     for item in bits:
         items.append(item)
     return RandomgenNode(items[1:])

 class RandomgenNode(template.Node):
    def __init__(self, items):
       self.items = []
       for item in items:
          self.items.append(item)

    def render(self, context):
        arg1 = self.items[0]
        arg2 = self.items[1]
        if "hash" in self.items:
            result = os.urandom(16).encode('hex')
        elif "float" in self.items:
            result = random.uniform(int(arg1), int(arg2))
        elif not self.items:
            result = random.random()
        else:
            result = random.randint(int(arg1), int(arg2))
        return result

在我的html模板中,我使用了load标签来导入模板标签.py文件:

{% load custom_tag %}

在特定按钮单击时,randomgen() 函数仅被调用一次:

$(document).on("click", ".add_div_btn", function() {
     let random_id = "{% randomgen 100 1000 %}";
     <!-- will generate a random number between 10 and 100 -->
     console.log("random id: ", random_id);
});

但是,在第一个按钮之后单击的每个按钮都会生成相同的数字。

在检查控制台日志时,我发现 custom_tag.py 文件中的 randomgen() 函数只被调用了一次。

我不确定如何在 javascript 中正确调用 django 模板标记函数。

【问题讨论】:

    标签: javascript django django-template-filters


    【解决方案1】:

    JavaScript 在前端运行,Django 模板标签在服务器上运行。

    模板中的 JavaScript 最终会呈现为(例如)

    $(document).on("click", ".add_div_btn", function() {
         let random_id = "477";
         <!-- will generate a random number between 10 and 100 -->
         console.log("random id: ", random_id);
    });
    

    当然,它总是会打印相同的 ID。

    如果你真的,真的需要在服务器端生成随机 ID,你需要对服务器上的 API 端点进行 AJAX/fetch 调用......但你真的可能想要的是

    $(document).on("click", ".add_div_btn", function() {
         let random_id = Math.floor(100 + Math.random() * (1000 - 100));
         // will generate a random number between 10 and 1000
         console.log("random id: ", random_id);
    });
    

    根本没有自定义模板标签。

    【讨论】:

    • 这其实是个好主意,改用javascript的基本随机数生成器函数。
    • 既然你提到了ajax调用,你能举一个对django模板标签函数进行ajax调用的例子吗?
    • 这确实超出了这个问题的范围,但是任何 fetch() 的旧示例和返回 JSON 响应的简单视图都可以。
    猜你喜欢
    • 1970-01-01
    • 2018-09-16
    • 2015-04-13
    • 2014-02-26
    • 2016-05-03
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多