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

5

我正在使用FlaskJinja2作为模板语言。

如何使用Jinja2将多维Python结构转换为相应的javascript结构?

示例(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个回答

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 实体进行正确转义。


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相比要慢得多。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接