如何通过Jinja2将Python站点列表转为JS变量(无需额外参数)
解决Jinja2模板中生成自动补全JS数组的问题
嘿,我懂你的困扰——Jinja2确实不支持Python原生的列表推导式语法,不过咱们完全可以不用在后端额外拼接数组,直接靠模板内置的过滤器就能搞定这个需求!
正确的模板写法
你可以用Jinja2的map过滤器来提取每个sqlite3.Row对象里的station_name字段,再结合list和tojson过滤器生成合法的JavaScript数组:
<script> var station_names = {{ stations|map(attribute='station_name')|list|tojson }}; </script>
为什么这个写法可行?
map(attribute='station_name'):遍历传入的stations列表,逐个提取每个sqlite3.Row对象的station_name属性(因为sqlite3.Row支持类似字典的键访问,所以这个写法完全有效)。|list:把map返回的迭代器转换成Jinja2能处理的列表对象。|tojson:把这个列表转换成符合JSON规范的字符串,直接嵌入到JavaScript代码里就成了合法的数组变量。
举个实际的例子,如果你的stations列表包含三个站点,生成的JS代码会是这样的:
var station_names = ["中央车站", "东城区站", "西郊区站"];
这样就完美实现了你想要的效果,不用在Python后端额外处理数组,纯模板层面就能搞定啦!
内容的提问来源于stack exchange,提问作者Mathias




