2011-05-31 63 views
1

這個模板變量{{object.video.description}}是outputing這樣的文字:簡單的Django問題:如何讓html作爲變量的輸出?

Welcome to <a href="http://google.com">Saint Francis Academy</a> in the heart of Washington. 

我怎樣才能獲得鏈接顯示爲實際的鏈接,而不是與HTML實體被替換。我試圖過濾它安全,但沒有運氣:{{object.video.description|safe}}

回答

2

你可以去django shell,看看什麼文字記錄在object.video.description?

video.description被定義爲html字符串的方式(我猜測<已被轉義爲&lt;,因此安全無助)。標記爲安全可以防止django在模板中呈現之前將<轉換爲&lt;;但不會將包含&lt;的字符串轉換爲<

如果該字符串最初保存與&lt; S和&gt是你可以把它們通過一個簡單的Python更換某處你的字符串處理轉換爲<>。例如,在你看來做這樣的事情:

htmlCodes = (('&', '&amp;'), 
      ('<', '&lt;'), 
      ('>', '&gt;'), 
      ('"', '&quot;'), 
      ("'", '&#39;'),) 

def unescape(some_html_str): 
    for c, html_code in htmlCodes: 
     some_html_str = some_html_str.replace(html_code, c) 
    return some_html_str 

,然後記得把它在上下文(和還記得以紀念它的安全)之前,你取消轉義字符串中您的視圖。 見How do I perform HTML decoding/encoding using Python/Django?

而且它可能是更好/更容易讓你在你的視圖使用mark_safefrom django.utils.safestring import mark_safe),以確保只有安全的弦標記爲可安全,而不是讓你的模板總是渲染的東西是安全的。

1
{% load markup %} 
{{ object.video.description|markdown }} 
+0

這假設video.description是用markdown寫的:例如,一個到wikipedia的降價頁面的鏈接是[[some_text](http://en.wikipedia.org/wiki/Markdown))。現在,如果用戶正在編寫文本說明,那麼使用標記語言https://docs.djangoproject.com/en/1.3/ref/contrib/markup/是一個非常好的主意(而不是讓用戶在他們可以插入的地方編寫原始html JavaScript的說一個CSRF攻擊或JavaScript彈出式窗口或其他)。 – 2011-05-31 20:41:32

+0

對不起,是的,我的答案應該符合jimbob博士所說的要求! – 2011-05-31 20:48:56