如何在Django中使用Context时禁用HTML编码

19 投票
2 回答
8175 浏览
提问于 2025-04-11 17:53

在我的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转义],里面介绍了一些在模板中关闭自动转义的方法,如果你想在模板里处理的话,可以去看看。

撰写回答