祝大家新年快乐!我想得到您的帮助,因为我正在考虑如何从代码中重写一小部分。
我在上下文中有一个django variable
集合,我在HTML template
中拾取了此变量(尤其是在HTML模板的JavaScript
部分中)。
它可以工作,但这不是一个好主意,因为我想将所有JS设置在一个JS文件中,并且每个HTML模板中都没有JavaScript。
在Django中,我有:
submethods = SubMethod.objects.all()
submethods_item = []
for item in submethods:
submethods_item.append({'id': item.id, 'text': item.name})
context['submethods_item'] = submethods_item
在我的HTML模板中,我拥有以下JavaScript:
function get_sub_method_options(keep_cur) {
var sel_option = $('select#id_method-group').find("option:selected");
var sel_val = sel_option.val();
if (!sel_val) {
$("select#id_method-sub_method").empty();
let all_sub_methods = {{ submethods_item|safe }};
for (var i = 0; i < all_sub_methods.length; i++) {
$("select#id_method-sub_method").append('<option value="' + all_sub_methods[i].id + '">' + all_sub_methods[i].text + '</option>'); //here add list of all submethods
}
return;
};
...
}
如您所见,我在这里获得Django变量:
let all_sub_methods = {{ submethods_item|safe }};
我如何做同样的事情,但是要用一种方法让我在包含Django变量的JavaScript文件中写JS?
如果我用HTML模板编写:
<script>
let all_sub_methods = {{ submethods_item|safe }};
</script>
然后我将JS部分写在一个外部文件.js中,它应该可以正常工作吗?
谢谢!
答案 0 :(得分:3)
您的方法可能有效,但只是偶然。
您的上下文变量submethods_item
是包含字典的Python列表。如果您在带有safe
过滤器的模板中使用该变量,则该变量将被呈现为有效的JavaScript字符串,但是有很多方法可能会出错。
推荐的方法是将变量序列化为JSON,在模板中应用escapejs
,然后在JavaScript中进行解析。
# view
import json
...
context['submethods_item'] = json.dumps(submethods_item)
# template
<script>
let all_sub_methods = JSON.parse("{{submethods_item|escapejs}}");
</script>