在对象属性的“js”脚本中应用 django 的模板过滤器

Posted

技术标签:

【中文标题】在对象属性的“js”脚本中应用 django 的模板过滤器【英文标题】:Apply django's template filters inside a `js` script on an object's attribute 【发布时间】: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() 将其从字符串转换为对象。

【问题讨论】:

【参考方案1】:

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

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

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

<script>
     geo_json | safe 
</script>

更新:

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

【讨论】:

它似乎不起作用,因为输出仍然在 JS 变量中转义。 有没有办法直接从DetailView::get_context_data()更改json字段并将其传递给模板? serialize('geojson', [context['object']]) 没有给出预期的结果。 是的,通过某种方式这个动作是可能的,但这些方式不是捷径 是的,这个问题现在似乎已经解决了,因为我正在使用您的代码,但实际上没有必要将它从视图中转储到模板中,因为字符串在模板中被转义(其中 @ 987654328@ 是必要的)。

以上是关于在对象属性的“js”脚本中应用 django 的模板过滤器的主要内容,如果未能解决你的问题,请参考以下文章

JS对象总结

Js脚本之jQuery学习笔记

TypeError:无法在 Django REST 框架中解压不可迭代的 int 对象

Django 3“用户”对象没有属性“管理员”

django - 模型 unicode() 显示外键对象属性

如何在js中获取session中的对象的属性值