在我的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模板标记函数进行正确的调用。
答案 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);
});
,根本没有自定义模板标签。