如何正确应用 django/jinja2 模板过滤器“转义”和“换行符”?

VKe*_*Ken 4 html python django django-templates jinja2

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

{{ my_variable|escape|linebreaks }}
Run Code Online (Sandbox Code Playgroud)

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

Lorem ipsum <br /> dolor sit amet <br />rg srg
gs rgsr rsg serg<br />r srg
Run Code Online (Sandbox Code Playgroud)

理想情况下

<br />
Run Code Online (Sandbox Code Playgroud)

不应该被转义,因为它是由“换行符”过滤器添加的。没有带有原始字符串的 html 标签。

我试过了:

{{ my_variable|linebreaks|escape }}
Run Code Online (Sandbox Code Playgroud)

但是,事实证明更糟:

<p>Lorem ipsum <br /> dolor sit amet <br />rg srg</p>
<p>gs rgsr rsg serg<br />r srg</p>
Run Code Online (Sandbox Code Playgroud)

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

谢谢。

Rei*_*cke 5

所以你linebreaks在jinja2模板中使用django的过滤器?在这种情况下,我会假设 django 标记字符串安全的方式可能与 jinja2 不兼容,因此转义了 django 添加的标签(如果 autoescape 处于活动状态)。

如果您将 jinja2 的安全过滤器添加到最后会怎样?

{{ my_variable|escape|linebreaks|safe }}
Run Code Online (Sandbox Code Playgroud)

否则,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
Run Code Online (Sandbox Code Playgroud)