将Django中的列表以数组形式导入Javascript

n3h0vuf2  于 2023-03-06  发布在  Java
关注(0)|答案(6)|浏览(121)

我在Django中有一个由我的www.example.com生成的python列表,我想把它传递给我的HTML模板中的javascript。我似乎不能把它作为数组传递给javascript ...我需要评估列表/数组是否包含某些数字,但它是作为字符串传递过来的。views.py in Django, and I would like to pass it to javascript in my HTML template. I cannot seem to get it into javscript as an array... I need to evaluate if the list/array contains certain numbers, but it is coming over as a string.
我将列表传递给HTML模板,如下所示:

def get_context_data(self, **kwargs):
    context = super(dashboardView, self).get_context_data(**kwargs)
    mylist = [10,22,33,45]
    context['mylist'] = mylist
    return context

当我使用:

<h1 id = "list"> {{mylist}}</h1>

它在浏览器上显示为[10,22,33,45]
然后在我的模板中,我使用javascript我有:

var mylist = document.getElementById("list").innerHTML;
for(i = 0; i < mylist.length; i++){
    console.log(mylist[i])
};

这将在控制台中返回:

'
[
1
0
,

2
2
........

我想要:

10
22
33
45

我试过用python转换成JSON,然后用javascript解析,但是似乎不能把这个字符串转换成数组,或者总是出错。

6gpjuf90

6gpjuf901#

如果你绝对确定你的列表是安全的(我的意思是它永远不会包含用户输入的任何内容),这是非常简单的。
你认为:

context={"my_list": ["item1", "item2"]}

在模板中:

{{ my_list|safe }}

呈现为:

['item1', 'item2']

例如:

{{ my_list|safe }}.forEach(item => {
  console.log(item)
})

令人印象深刻的是,如果你传递一个带撇号的字符串,Django会自动改变引号类型,所以

context = {"my_list": ["item1", "it'em2"]}

呈现为(注意双引号):

['item1', "it'em2"]

所以

{{ my_list|safe }}.forEach

仍然工作(测试Django 3.2.6)。
即使这样也行得通:

context = {"my_list": ["item1", "it'em\"2"]}

渲染为:

['item1', 'it\'em"2']

所以

{{ my_list|safe }}.forEach
  • 仍然 * 工作。

然而,正如我在前面所说的,如果您的列表可能包含来自用户的输入,我仍然不相信这种方法。

编辑:现在这是最高的答案,我想添加一个更安全的方法,使它更容易完全安全。这是有趣的django-argonauts,虽然我不是一个安全Maven,所以不能确认的方法:

@register.filter(is_safe=True)
def jsonify(json_object):
    """
    Output the json encoding of its argument.
    This will escape all the HTML/XML special characters with their unicode
    escapes, so it is safe to be output anywhere except for inside a tag
    attribute.
    If the output needs to be put in an attribute, entitize the output of this
    filter.
    """

    json_str = json.dumps(json_object)

    # Escape all the XML/HTML special characters.
    escapes = ["<", ">", "&"]
    for c in escapes:
        json_str = json_str.replace(c, r"\u%04x" % ord(c))

    # now it's safe to use mark_safe
    return mark_safe(json_str)

然后在模板中:

{% load jsonify %}
{{ value|jsonify }}
wgmfuz8q

wgmfuz8q2#

在视图中,可以将对象设置为JSON对象:

import json

mylistraw = [10,22,33,45]
mylist = json.dumps(mylistraw)
context = {''mylistjson': mylist}

现在你可以在JavaScript中使用你的对象了:

var mylist = JSON.parse("{{mylistjson}}")
n1bvdmb6

n1bvdmb63#

您可以简单地使用tojson标记将python列表转换为js数组。
就像-

var mylist = {{mylist|tojson}};
for(i = 0; i < mylist.length; i++){
    console.log(mylist[i])
};

试试看,如果有问题就告诉我。

0kjbasz6

0kjbasz64#

Django有json_script模板标记,它通过转义<>&字符来解决XSS漏洞。
Django json_script文档在此

8hhllhi2

8hhllhi25#

在您的例子中,一个简单的方法是将列表作为字符串','.join(mylist)发送,然后在模板中,您可以简单地在js中使用split(',')
视图

mylist = [10,22,33,45]
context['mylist'] = ','.join([str(i) for i in mylist])

html和js

var mylist = document.getElementById("list").innerHTML;
mylist = mylist.split(',')
for(i = 0; i < mylist.length; i++){
    console.log(mylist[i])
};

或者如果您的js也在模板中

var mylist = '{{mylist}}'.split(',');
for(i = 0; i < mylist.length; i++){
    console.log(mylist[i])
};
mlmc2os5

mlmc2os56#

用JavaScript而不是HTML设置列表值。

<script>
var mylist = {{mylist}};
for(i = 0; i < mylist.length; i++){
    console.log(mylist[i])
};
<\ script>

您需要在HTML模板文件中执行此操作,而不是在外部JS文件中。

相关问题