10

私のWebアプリでは、ユーザーはブログ投稿を行うことができます。<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

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 に答える