2011-02-04 31 views
4

我正在嘗試使用django模板過濾器來轉義變量,如下所示。 我使用Jinja2的模板引擎,而不是僅僅Django的主要templateing引擎如何正確應用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 /> 

不應該逃脫,因爲它是由「linebreaks」過濾器添加的。沒有原始字符串的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 }} 

給力的 '逃離' 過濾器首先應用。 默認情況下,'escape'只適用於所有其他過濾器盡頭的位置,所以force_escape是另一個最簡單的選擇。

4

所以你在jinja2模板中使用django的linebreaks過濾器?在這種情況下,我會假設django標記字符串安全的方式可能與jinja2不兼容,因此會轉義django添加的標記(如果autoescape處於活動狀態)。

如果您將jinja2的安全過濾器添加到最後?

{{ my_variable|escape|linebreaks|safe }} 

否則,有一個Jinja2的文檔中的自定義過濾器,這似乎是類似Django的換行的例子。 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 2011-02-05 04:17:02

+0

@VKen你會介意分享目標=「_ blank」urlize代碼嗎?我一直在尋找一種方法來實現這一功能。 – chrickso 2012-09-21 02:11:17

相關問題