2015-12-03 70 views
0

我想顯示帶有下標的化合物的化學分子式。我有一個化合物列表,其中很少應該使用下標書寫。我寫了下面的代碼:Django未使用python代碼分配標記來呈現html

def contains_number(string): 
    new_string = '' 
    int_str_list = list(map(str, list(range(9)))) 
    for item in string: 
     if item in int_str_list: 
      new_string += '<sub> '+item+' </sub>' 
     else: 
      new_string += item 
    return new_string 

此代碼的工作,當我經過串狀的Fe2O3,我得到的輸出,如: Fe<sub>2</sub>O<sub>3</sub>這是我想要的。

然而,當我通過此作爲上下文變量來Django的模板,它不呈現爲鐵ø但作爲文本Fe<sub>2</sub>O<sub>3</sub>

由於我是Django的新手,我錯過了一些東西,我知道。

我該如何解決這個問題?

+0

這兩個輸出對我來說看起來一樣,有什麼不同?你使用哪些代碼作爲上下文傳遞? – Sayse

+0

這就是我的想法。它是在瀏覽器中呈現的,但是,如果放入純html中,它將給出下標文本。 –

+2

你應該在django模板中關閉逃脫功能:https://docs.djangoproject.com/en/1.8/ref/templates/builtins/#autoescape – stellasia

回答

1

您的問題與HTML標記escape有關。在django模板中關閉autoescape,它應該可以正常工作:

{% autoescape off %} 
    {{ you_text }} 
{% endautoescape %} 
2

Django autoescapes模板變量。如果您查看生成的輸出的來源,您將看到類似&lt;sub&gt;2...的內容。

如果參數string是用戶生成的輸入,那麼不要僅自動轉義自動轉換!

自動轉義可防止XSS攻擊,因此關閉它可能會解決您的問題,但如果您不確切知道自己在做什麼可能會導致安全漏洞。

from django.utils.html import escape 
from django.utils.safestring import mark_safe 


def contains_number(string): 
    new_string = '' 
    for item in string: 
     if item.isdigit(): 
      # we know item is a number, so no need to escape it 
      new_string += '<sub> '+ item +' </sub>' 
     else: 
      new_string += escape(item) 
    # we built new_string from safe parts, so we can mark it as 
    # safe to prevent autoescaping 
    return mark_safe(new_string) 
2

...或者你可以使用safe過濾器:

{{ your_text|safe }} 

我相信,在大多數情況下,它的安全比autoescape塊(沒有任何風險,你會離開你逃避轉義的東西)。