2015-12-03 20 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块(没有任何风险,你会离开你逃避转义的东西)。