我当前的Wagtail项目有一个非常简单的结构,其中一些通用页面只有一个正文RichTextField
。这些只是基本的CMS类型的页面,编辑器将在富文本编辑器中编辑一些内容并发布。
其中一页(并且可能在时间上更多(是";通缉的帮助";页面,并使用来自第三方服务的外部javascript片段,该片段列出了当前的职位空缺,并链接到他们托管的应用程序。
由于向富文本编辑器添加<script>
标记只需转义它并只显示文本值,所以我向页面模型添加了一个额外的extra_scripts = models.TextField()
,并向内容面板添加了相应的FieldPanel('extra_scripts')
。这允许用户粘贴一些任意的javascript片段。
如果我在带有{{page.extra_scripts}}
的模板中包含此字段值,它只显示内容,不执行javascript。通过查看可用的wagtailcore_tags
,我没有看到应该用来执行内容的过滤器,当它与{{}}
标记一起使用时,我认为模板引擎会处理它,这样它就不会执行。
如何在模板中包含此字段以便执行javascript
我知道我可以在没有<script>
标记的情况下将字段更改为实际的javascript内容,但该代码段还包括一些基本的HTML元素,如果我只给最终用户一个字段来粘贴代码段的某些部分,他们就不会直观地知道他们需要手动编辑所提供的代码段。我希望最终用户能够复制/粘贴他们获得的片段,并使其工作,而无需理解其他任何内容。
这是Django模板语言自动转义行为的结果,可以通过添加|safe
过滤器来覆盖:
{{ page.extra_scripts|safe }}
当然,只有当您的编辑用户完全可信时,您才应该这样做,因为这将使他们能够运行任意代码(例如,包括劫持碰巧访问该页面的超级用户的会话cookie(。