0

私はデータベースからの情報を渡すという見方をしています:

def serve_article(request, id):
    served_article = Article.objects.get(pk=id)

    # Strips out new line and tab characters
    article_snippet = served_article.full_text.replace('\n','').replace('\t','')

    # Gets first 300 word characters
    article_snippet = re.match(r'(.{,300})\W', article_snippet).group(1)

    return render(request, 'article.html', {'served_article':served_article,
                                            'article_snippet':article_snippet})

article_snippet、レンダリングされるまでのUnicode文字列には、多くのHTMLエンティティコードが含まれています(例:’'に©マップされ、レンダリング時に©にマップされます)

ただし、テンプレートではこれらのシンボルは評価されず、タグ{{ article_snippet }}内にラップされているかのように空白のままになります(そうではありません)。<code>

私は<meta charset="utf-8">一番上にあり、ページ上の他のシンボルはうまく評価されているので、明らかにこれらのシンボルはどういうわけかエスケープされています。この動作が発生するのはなぜですか。また、無効にするにはどうすればよいですか。

4

3 に答える 3

2

Riatecheは、90%の確率で役立つ安全なフィルターを使用することを提案しました。それ以外の場合は(HTMLをメッセージにフォーマットする必要があります-djangoメッセージングフレームワークを使用して)、手動で実行できる必要があります。

文字列を手動で安全にするには:https ://docs.djangoproject.com/en/1.4/ref/utils/#django.utils.safestring.mark_safe

from django.utils.safestring import mark_safe

def serve_article(request, id):
    served_article = Article.objects.get(pk=id)

    # Strips out new line and tab characters
    article_snippet = served_article.full_text.replace('\n','').replace('\t','')

    # Gets first 300 word characters
    article_snippet = re.match(r'(.{,300})\W', article_snippet).group(1)

    # MARK THIS VALUE AS SAFE IN YOUR VIEW
    article_snippet = mark_safe(article_snippet)

    return render(request, 'article.html', {'served_article':served_article,
                                        'article_snippet':article_snippet})
于 2012-07-08T00:01:14.277 に答える
2

個々の変数の自動エスケープを無効にするには、次のsafeフィルターを使用します。

This will be escaped: {{ data }}
This will not be escaped: {{ data|safe }}

https://docs.djangoproject.com/en/dev/topics/templates/

<script>変数に、ユーザーが提供した危険なHTML(タグなど)が含まれていないことを確認してください。

于 2012-07-07T23:55:55.527 に答える
0

Django V1.9で、安全なテンプレートタグを他のテンプレートタグの後にスタックすると機能しないため、安全がコンテキスト変数の直後にあることを確認してください。

.pyコード

context['variable'] = "&trade;"

HTML

以下の作品

{{ variable|safe|capfirst|linebreaksbr }} -> displays: TM

以下は機能しません

{{ variable|capfirst|linebreaksbr|safe }} -> displays: &trade;
于 2016-06-30T06:50:47.927 に答える