2011-02-04 7 views
4

私は現在、以下のようにdjangoテンプレートフィルタを使用して変数をエスケープしようとしています。 私だけではなく、Djangoの主要templateingエンジンのJinja2のテンプレートエンジンを使用しdjango/jinja2テンプレートフィルタ 'escape'と 'linebreaks'を正しく適用するには?

{{ my_variable|escape|linebreaks }} 

次のように改行を含む文字列の出力は次のとおりです。理想的

Lorem ipsum <br /> dolor sit amet <br />rg srg 
gs rgsr rsg serg<br />r srg 

<br /> 

ではありません"改行"フィルタによって追加されるので、エスケープされるはずです。元の文字列にはHTMLタグはありません。

私が試した:

{{ my_variable|linebreaks|escape }} 

をしかし、それはさらに悪い判明:誰もが私はテンプレートフィルタを適用すると間違って何かをした、および/またはにできるかどうかを知っているん

<p>Lorem ipsum <br /> dolor sit amet <br />rg srg</p> 
<p>gs rgsr rsg serg<br />r srg</p> 

を正しい方向に私を向ける?

ありがとうございました。

答えて

2

愚かな私に、私が使用できるようです:

{{ my_variable|forceescape|linebreaks }} 

を最初に適用するには 'エスケープ' フィルタを強制します。 デフォルトでは、 'エスケープ'は位置にかかわらず他のすべてのフィルタの末尾にのみ適用されるため、force_escapeは他の最も簡単な代替手段です。

+0

私は '{{my_variable | escape | linebreaks | safe}}'(@Reinerが提案したように)を終わらせることになりました 私には二重のエスケープされたものを 'forceescape'するだけです。 –

4

したがって、djangoのlinebreaksフィルタをjinja2テンプレートで使用していますか?その場合、djangoが文字列の安全をマークする方法は、jinja2と互換性がない可能性があるため、djangoによって追加されたタグをエスケープします(autoescapeがアクティブな場合)。

jinja2のセーフフィルターを最後に追加した場合はどうなりますか?

{{ my_variable|escape|linebreaks|safe }} 

そうでない場合は、Djangoの改行に似ているようだJinja2のドキュメントのカスタムフィルタの例があります。 http://jinja.pocoo.org/docs/api/#custom-filters

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 
+0

jinja2カスタムフィルターを私に指摘してくれてありがとう。それはより複雑な解決策ですが、urlizeリンクのためにtarget = "_ blank"を行うカスタムフィルタを実装するという関連問題を理解するのに役立ちました。ありがとう! – VKen

+0

@VKenあなたはtarget = "_ blank" urlizeコードを共有してもよろしいですか?私はその機能を実装する方法を探してきました。 – chrickso

関連する問題