django模板标记在javascript函数中没有被多次调用

时间:2019-07-02 13:50:33

标签: javascript django django-template-filters

在我的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模板标记函数进行正确的调用。

1 个答案:

答案 0 :(得分:2)

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

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

// in Article
Article.beforeFind('chooseLocale', (options) => {
  const locale = options.locale || 'en';
  delete options.locale;
  if (locale !== 'any') {
    options.attributes = {
      exclude: ['title'],
      include: [
        [sequelize.literal(`"title" ->> '${locale}'`), 'title'],
      ]
    };
  }

  return options;
});

因此,它将始终打印相同的ID。

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

$(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);
});

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