在我的网络应用中,用户可以发布博客文章。当我显示博客帖子时,不显示换行符,因为我没有用<br>
标签替换新行。问题是我在Jinja中启用了自动转换,因此<br>
标签被转义。我不想暂时禁用自动转义,我想特别允许<br>
标签。我该怎么做?
答案 0 :(得分:27)
我有另一个我认为最好的答案。最初我只是按原样显示我的变量post.content
,并且没有保留换行符。这里的解决方案都没有奏效(好),我的预解决方案只是一个快速解决方案并且存在重大问题。这是真正的解决方案:
{% for line in post.content.splitlines() %}
{{line}}<br>
{% endfor %}
答案 1 :(得分:2)
您可以使用|safe
过滤器,也可以使用autoescape块:
{% autoescape false %}
{{ content goes here }}
{% autoescape %}
您还可以在environment至False
中设置自动加注。
答案 2 :(得分: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>
答案 3 :(得分: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}}
答案 4 :(得分: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
答案 5 :(得分:0)
请注意,默认情况下我启用了自动启用功能,因此我不会在此功能中检查它,但这是我正在使用的
def nl2br(value):
split = value.split('\n')
return jinja2.Markup('<br>').join(split)
当然,
jinja_env.filters['nl2br'] = nl2br
答案 6 :(得分:-1)
解决方案是在我拥有内容的区域周围放置<pre></pre>
标签。
答案 7 :(得分:-1)
最简单的方法是自己逃离场地,然后添加换行符。当你在jinja中传递它时,将其标记为安全,因此它不会被自动调整。