Jinja2:如何创建多维JavaScript数组?

5 投票
2 回答
5937 浏览
提问于 2025-04-16 21:00

我正在使用Flask,并且用Jinja2作为模板语言。

我想知道如何把一个多维的Python结构转换成在JavaScript中对应的结构,使用Jinja2来实现。

举个例子(Python/Flask):

pyStruct = [{key1:value1, key2:value2, [{subkey1:subvalue1, subkey2:subvalue2,}]},
            {key1:value1, key2:value2, [{subkey1:subvalue1, subkey2:subvalue2,}]},]

render_template('jinjatemplate.html', pyStruct=pyStruct)

再举个例子(Jinja2):

??

我想问的是,这个转换只能通过在Jinja2中写复杂的循环来实现吗?还是说我漏掉了什么简单的方法?

如果答案是,确实需要在Jinja2中使用复杂的循环,那么直接在Python中生成JavaScript代码,然后把它传给Jinja2来包含,可能会简单很多。

不过这样似乎有点违背使用像Jinja2这样的模板语言的初衷……

我尝试过(Jinja2):

{{ pyStruct|safe }}

……只要没有使用unicode,并且不超出Ascii范围(在我的情况下通常会超出),这个方法实际上是有效的。

哦,如果你在想为什么要传这种结构?我发现我经常需要把比较复杂的结构传给JavaScript,以便在菜单和其他复杂的选择界面中使用。

2 个回答

2

用json格式把它序列化:

from django.utils import simplejson

pyStruct = [{'key1':'value1',
             'key2':'value2',
             'key3':[{'subkey1':'subvalue1', 'subkey2':'subvalue2'}]},
            {'key1':'value1',
             'key2':'value2',
             'key3':[{'subkey1':'subvalue1', 'subkey2':'subvalue2'}]}]
print simplejson.dumps(pyStruct)

Flask可能有类似的方法来把数据转成json格式。虽然也可以在jinja2中用循环来实现,但这样做通常会慢很多,还是用json更快。

6

你可以使用 json 模块,既可以作为 Jinja 的过滤器,也可以直接把 json.dumps() 的结果传给你的模板。

pyStruct = [{key1:value1, key2:value2, [{subkey1:subvalue1, subkey2:subvalue2,}]},
            {key1:value1, key2:value2, [{subkey1:subvalue1, subkey2:subvalue2,}]},]

render_template('jinjatemplate.html', json_struct=json.dumps(pyStruct))

在模板中:

var myStruct = ({{ json_struct|e }});

注意:我对转义部分(|e 过滤器)有点不太确定。你可能需要检查一下 <, >, & 这些字符是否用 Unicode 转义序列正确转义,而不是用 XML 实体。

撰写回答