私のWebアプリでは、ユーザーはブログ投稿を行うことができます。<br>
ブログ投稿を表示すると、改行をタグに置き換えなかったため、改行が表示されません。問題は、Jinjaで自動エスケープをオンにしているため、<br>
タグがエスケープされていることです。自動エスケープを一時的に無効にしたくありません。特に<br>
タグを許可したいと思います。どうすればいいですか?
質問する
4415 次
8 に答える
29
私は私が最高だと思う別の答えがあります。最初は、変数post.content
をそのまま表示していましたが、改行は保持されていませんでした。ここでの解決策はどれも(うまく)機能しませんでした。私の事前の解決策はただの簡単な修正であり、大きな問題がありました。これが本当の解決策です:
{% for line in post.content.splitlines() %}
{{line}}<br>
{% endfor %}
于 2012-05-16T03:43:28.343 に答える
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
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
これが私自身が書いたフィルターです:
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
デフォルトで自動エスケープがオンになっているので、この関数ではチェックしませんが、これが私が使用しているものであることに注意してください
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
解決策は<pre></pre>
、コンテンツがあった領域の周りにタグを付けることでした。
于 2012-05-03T17:51:53.220 に答える
-1
これを行う最も簡単な方法は、フィールドを自分でエスケープしてから、改行を追加することです。jinjaで渡すときは、自動エスケープされないように安全としてマークします。
于 2012-05-04T01:01:48.317 に答える