使用Javascript部分在HTML模板中获取Django变量

时间:2019-01-03 09:43:40

标签: javascript html django

祝大家新年快乐!我想得到您的帮助,因为我正在考虑如何从代码中重写一小部分。

我在上下文中有一个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中,它应该可以正常工作吗?

谢谢!

1 个答案:

答案 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>