我正在尝试使用django模板过滤器来转义变量,如下所示。 我使用的是jinja2模板引擎,而不仅仅是django的主要模板引擎
{{ my_variable|escape|linebreaks }}
带换行符的字符串输出如下:
Lorem ipsum <br /> dolor sit amet <br />rg srg
gs rgsr rsg serg<br />r srg
理想情况下
<br />
不应该被转义,因为它是由“linebreaks”过滤器添加的。原始字符串没有html标签。
我试过了:
{{ my_variable|linebreaks|escape }}
但事实证明情况更糟:
<p>Lorem ipsum <br /> dolor sit amet <br />rg srg</p>
<p>gs rgsr rsg serg<br />r srg</p>
有没有人知道我是否在应用模板过滤器时出错了,并且/或者能够指出我正确的方向?
感谢。
答案 0 :(得分:4)
所以你在jinja2模板中使用django的linebreaks
过滤器?在这种情况下,我会假设django标记字符串安全的方式可能与jinja2不兼容,因此转义django添加的标记(如果autoescape处于活动状态)。
如果您将jinja2中的安全过滤器添加到结尾怎么办?
{{ my_variable|escape|linebreaks|safe }}
否则,jinja2文档中的自定义过滤器有一个示例,似乎与django的换行符相似。 http://jinja.pocoo.org/docs/api/#custom-filters
import re
from jinja2 import evalcontextfilter, Markup, escape
_paragraph_re = re.compile(r'(?:\r\n|\r|\n){2,}')
@evalcontextfilter
def nl2br(eval_ctx, value):
result = u'\n\n'.join(u'<p>%s</p>' % p.replace('\n', '<br>\n')
for p in _paragraph_re.split(escape(value)))
if eval_ctx.autoescape:
result = Markup(result)
return result
答案 1 :(得分:2)
愚蠢的我,似乎我可以使用:
{{ my_variable|forceescape|linebreaks }}
强制首先应用'escape'过滤器。 默认情况下,'escape'仅在所有其他过滤器的末尾应用,尽管位置正确,因此force_escape是另一个最简单的替代方案。