【问题标题】:Apply django's template filters inside a `js` script on an object's attribute在对象属性的“js”脚本中应用 django 的模板过滤器
【发布时间】:2018-08-09 14:53:40
【问题描述】:

我无法在对象属性的 js 脚本中使用 django 的模板过滤器。

这段代码返回一个js SyntaxError:

<script>
    {{ obj.geometry.geojson | safe }}
</script>

如果将过滤器应用于对象,则不会引发错误:

<script>
    {{ obj | safe }}
</script>

上面GeoJson文件的内容如下图所示:

{ "type": "Polygon", "coordinates": [ [ [ 3, 36 ], ... }

我显然不想将引号字符 (") 转义为 (&amp;quot;),因此我可以稍后通过 JSON.parse() 将其从字符串转换为对象。

【问题讨论】:

    标签: javascript json django django-templates django-template-filters


    【解决方案1】:

    在视图中生成新的 GeoJson 字符串并将其传递给类似如下的模板:

    return render(
               request,
               'my_template.html',
               {'obj': obj, 'geo_json': json.dumps(obj.geometry.geojson)}
           )
    

    现在你需要 GeoJson 内容的任何地方都使用它,如下所示:

    <script>
        {{ geo_json | safe }}
    </script>
    

    更新:

    您也可以通过context-processorstemplate-tags 处理此问题,但这种方式可能很难且不必要...

    【讨论】:

    • 它似乎不起作用,因为输出仍然在 JS 变量中转义。
    • 有没有办法直接从DetailView::get_context_data()更改json字段并将其传递给模板? serialize('geojson', [context['object']]) 没有给出预期的结果。
    • 是的,通过某种方式这个动作是可能的,但这些方式不是捷径
    • 是的,这个问题现在似乎已经解决了,因为我正在使用您的代码,但实际上没有必要将它从视图中转储到模板中,因为字符串在模板中被转义(其中 @ 987654328@ 是必要的)。
    猜你喜欢
    • 2011-06-18
    • 1970-01-01
    • 2012-10-11
    • 2021-11-17
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多