Django没有使用python代码中指定的标签呈现html

时间:2015-12-03 13:16:05

标签: python django

我想用下标显示化合物的化学式。我有一个化合物列表,其中很少应该使用下标。我写了以下代码:

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 2 O 3 ,而是呈现为文本Fe<sub>2</sub>O<sub>3</sub>

由于我是Django的新手,我知道,我错过了一些东西。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:2)

...或者您可以使用safe过滤器:

{{ your_text|safe }}

我相信在大多数情况下它比autoescape块更安全(没有风险你会留下未转义的东西)。

答案 2 :(得分:1)

您的问题与HTML代码escape有关。在django模板中关闭autoescape它应该可以正常工作:

<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,    
'columns' => [
    ['class' => 'yii\grid\SerialColumn'],

        'id_attribute',
        'id_attribute_group',
        'color',  
        'position',                  
    ],  

]); ?>