首页 > 解决方案 > 为什么 Jinja 不接受我的 JS String 变量是什么?

问题描述

我有一个 JavaScript 函数来制作图表,我必须动态地将数据源传递给它。我的这个问题的样本是'ice-cream_sales'。数据源是一个字符串变量。

var chosen_data = "ice-cream_sales";

function makeChart(chosen_data){
     var data_source = "{{ url_for('static', filename='data/ {% chosen_data %} .csv')}}";

     d3.select("svg").remove();
     var x = d3.time.scale().range([0, width]);
     ...
}

makeChart(chosen_data, "blue", 900, 400); // Make the chart

所以 selected_data 是一个要与 .csv 连接的字符串。它位于一个名为 data 的静态文件夹中。

如果我 console.log 我传递给函数的这个字符串,Jinja 会将我的 JS 变量变成奇怪的东西,看起来像:

/static/data/Streamchart/%20%7B%25%20chosen_data%20%25%7D%20.csv

为什么使用 Jinja 时“ice-cream_sales”会变成“%20%7B%25%20chosen_data%20%25%7D%20”,我该如何预防?

蒂亚。

标签: jinja2

解决方案


您不能{% chosen_data %}在表达式中放置语句,{{ }}因为 jinja 将其解析为一个简单的字符串,然后如您所见那样将其转义。而且,chosen_data是一个javascript变量,不是jinja的。

您可以在文档中找到 Jinja 分隔符的实际用法。如果您必须从 javascript 设置数据的名称,您可以使用简单的替换:

var data_source = "{{ url_for('static', filename='data/chosen_data.csv')}}";
var data_source = data_source.replace("chosen_data", chosen_data);

否则,如果您在 Jinja 中像这样设置变量会更优雅:

{% set chosen_data = "ice_cream_sales" %}
...
var data_souce = "{{ url_for('static', filename='data/' ~ chosen_data ~ '.csv')}}";

推荐阅读