4

我目前正在尝试使用 django 模板过滤器来转义变量,如下所示。我使用 jinja2 模板引擎,而不仅仅是 django 的主要模板引擎

{{ my_variable|escape|linebreaks }}

带有换行符的字符串的输出如下:

Lorem ipsum <br /> dolor sit amet <br />rg srg
gs rgsr rsg serg<br />r srg

理想情况下

<br />

不应该被转义,因为它是由“换行符”过滤器添加的。没有带有原始字符串的 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>

有谁知道我是否在应用模板过滤器时做错了什么,和/或能够为我指明正确的方向?

谢谢。

4

2 回答 2

5

So you are using django's linebreaks filter in a jinja2 template? In that case, I would assume that the way django marks a string safe may not be compatible with jinja2, therefore escaping the tags added by django (if autoescape is active).

What if you added the safe filter from jinja2 to the end?

{{ my_variable|escape|linebreaks|safe }}

Otherwise, there is an example for a custom filter in jinja2 documentation that seems to be similar to django's linebreaks. 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
于 2011-02-04T18:51:51.420 回答
2

愚蠢的我,似乎我可以使用:

{{ my_variable|forceescape|linebreaks }}

强制“转义”过滤器首先应用。默认情况下,'escape' 仅适用于所有其他过滤器的末尾,尽管有位置,所以 force_escape 是另一个最简单的选择。

于 2011-02-05T04:15:17.680 回答