10

在我的网络应用程序中,用户可以发表博客文章。当我显示博客文章时,没有显示换行符,因为我没有用<br>标签替换新行。问题是我在 Jinja 中打开了自动转义,所以<br>标签被转义了。我不想暂时禁用自动转义,我想专门允许<br>标签。我该怎么做?

4

8 回答 8

29

我有另一个我认为是最好的答案。最初我只是post.content按原样显示我的变量,并且没有保留换行符。这里的解决方案都不起作用(很好),我的预解决方案只是一个快速修复并且存在重大问题。这是真正的解决方案:

{% for line in post.content.splitlines() %}
    {{line}}<br>
{% endfor %}
于 2012-05-16T03:43:28.343 回答
2

您可以使用|safe过滤器,或使用自动转义块:

{% autoescape false %}
{{ content goes here }}
{% autoescape %}

您还可以将环境中的自动转义设置为False.

于 2012-05-07T12:22:49.490 回答
2

在您的模型对象中,添加如下函数:

class Post(db.Model):
    # ...

    def html_content(self):
        # Escape, then convert newlines to br tags, then wrap with Markup object
        # so that the <br> tags don't get escaped.
        def escape(s):
            # unicode() forces the conversion to happen immediately,
            # instead of at substitution time (else <br> would get escaped too)
            return unicode(jinja2.escape(s))
        return jinja2.Markup(escape(self.content).replace('\n', '<br>'))

然后在您的模板中,只需调用它:

<p>{{ post.html_content() }}</p>
于 2012-05-08T02:28:00.080 回答
0

这是我自己写的一个过滤器:

import jinja2

@jinja2.evalcontextfilter
def nl2br(eval_ctx, value):
    result = jinja2.escape(value).unescape().replace('\n', '<br>')
    if eval_ctx.autoescape:
        result = jinja2.Markup(result)
    return result

jinja2.Environment()并通过调用将过滤器添加到:

jinja_env.filters['nl2br'] = nl2br
于 2015-01-06T02:56:48.207 回答
0

您可以创建一个 jinja2 过滤器:

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

您需要先将过滤器添加到您的 jinja2 环境中,然后才能使用它:

JINJA2_ENV.filters['nl2br'] = jinja2_filters.nl2br

在您的模板中,您可以使用该过滤器:

{{post.content|nl2br}}
于 2014-02-06T02:17:03.837 回答
0

请注意,我默认情况下启用了自动转义,因此我不在此功能中检查它,但这就是我正在使用的

def nl2br(value): 
  split = value.split('\n')
  return jinja2.Markup('<br>').join(split)

那么当然,

jinja_env.filters['nl2br'] = nl2br
于 2016-10-24T03:15:42.667 回答
-1

最简单的方法是自己转义该字段,然后添加换行符。当你在 jinja 中传递它时,将其标记为安全,这样它就不会自动转义。

于 2012-05-04T01:01:48.317 回答
-1

<pre></pre>解决方案是在我拥有内容的区域周围放置标签。

于 2012-05-03T17:51:53.220 回答