如何在Django中使用Context时禁用HTML编码
在我的Django应用中,我用一个模板来生成邮件内容,其中有一个参数是网址,注意这个网址里有两个参数,用“&”符号分开。
t = loader.get_template("sometemplate")
c = Context({
'foo': 'bar',
'url': 'http://127.0.0.1/test?a=1&b=2',
})
print t.render(c)
渲染后生成的结果是:http://127.0.0.1/test?a=1&b=2
注意这里的“&”被编码成了“&”。解决这个问题的一种方法是把每个参数单独传给模板,然后在模板里构建网址,但我想避免这样做。
有没有办法禁用上下文参数的HTML编码,或者至少避免对“&”符号进行编码呢?
2 个回答
9
或者你可以在模板中使用“安全”过滤器。
另外,我想强调一下,熟悉Django的文档是多么重要;很多常见问题都有简单易找的答案和解释(就像这个问题),多看看文档,了解它的工作原理,会大大减少你问“为什么会这样”的时间,让你有更多时间去构建你想要的东西。
25
如果你想要对某个变量关闭自动转义,可以使用 mark_safe
:
from django.utils.safestring import mark_safe
t = loader.get_template("sometemplate")
c = Context({
'foo': 'bar',
'url': mark_safe('http://127.0.0.1/test?a=1&b=2'),
})
print t.render(c)
另外,如果你想在Python代码中完全关闭自动转义,可以在初始化 Context
时使用 autoescape
参数:
c = Context({
'foo': 'bar',
'url': 'http://127.0.0.1/test?a=1&b=2',
}, autoescape=False)
文档中有一部分叫做 如何关闭[自动HTML转义],里面介绍了一些在模板中关闭自动转义的方法,如果你想在模板里处理的话,可以去看看。