我想用下标显示化合物的化学式。我有一个化合物列表,其中很少应该使用下标。我写了以下代码:
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的新手,我知道,我错过了一些东西。
我该如何解决这个问题?
答案 0 :(得分:2)
Django autoescapes模板变量。如果查看生成的输出的来源,您会看到<sub>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',
],
]); ?>