2012-01-08 16 views
11

それは言う:Djangoテンプレートで自動エスケープを防ぐ方法は?ドキュメントで

唯一の例外は、すでにいずれかの変数を埋めコードによって、エスケープから「安全」とマークされている変数であるか、それが適用される安全か脱出のフィルターを持っていたので、 "

私は実際にビューの中で安全なテンプレートタグを宣言する方法を探しています。私は何とかデザイナーに私の同僚は、それが良いアイデアだと思う度に追加するだけです。

https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs

答えて

22

Djangoはdjango.utils.safestring.mark_safeを使用して作成することができる安全列(具体SafeUnicode又はSafeString)と呼ばれる文字列のサブクラスを有します。テンプレートエンジンは、安全な文字列に遭遇すると、それはそれでエスケープHTMLを実行しません:

>>> from django.utils.safestring import mark_safe 
>>> from django.template import Template, Context 
>>> Template("{{ name }}").render(Context({'name': mark_safe('<b>Brad</b>')})) 
u"<b>Brad</b>" 

独自のテンプレートタグを書いている場合は、治療される文字列を返しますrender()を実装する必要がありますあなた自身が必要なエスケープを処理しなければならないという意味です。テンプレートフィルタを作成する場合は、フィルターに属性is_safe = Trueを設定して、戻り値の自動エスケープを避けることができます。

@register.filter 
def myfilter(value): 
    return value 
myfilter.is_safe = True 

詳細はhttps://docs.djangoproject.com/en/1.3/howto/custom-template-tags/#filters-and-auto-escapingを参照してください。

5

あなたはdjango.utils.safestring.mark_safeを呼び出し、それが(警告するポップアップ)をエスケープせずに印刷されたテンプレートでは、あなたに変数

... 
return direct_to_template('my-template.html', {'safe_var': mark_safe('<script>alert("");</script>')}) 

を渡すことができます。自動エスケープは実際には悪いことからあなたを救う素晴らしい機能ですが、

関連する問題