今天写了一个模板,在视图函数中,将含有html标记的内容传入模板,结果网页内容并没有将html的标记解析,而是原样输入。以为是自己写的有问题,于是换了一种写法,结果和原来一样。第一次代码如下:
视图函数:
def test(request):
tem=Template('<html><body>{{content}}<body></html>')
format='''<table border='1'>
<tr>
<td>name</td>
</tr>
</table>'''
html=tem.render(Context({'content':format}))
return HttpResponse(html)
</pre><p><span style="font-size:24px;">结果:</span></p><p><img src="https://img-blog.csdn.net/20140809161448259?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMTg0MTU3Nzk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" /></p><p></p><p><span style="font-size:24px">预期结果:</span></p><p><span style="font-size:24px"><img src="https://img-blog.csdn.net/20140809161353425?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMTg0MTU3Nzk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" /></span></p><p></p><p><span style="font-size:24px">所以一般不要在模板变量中写入html的内容,确实需要一些逻辑的表达,最好使用模板标记。出现上述现象的原因是因为,django处于安全考虑,对模板参数的内容进行了转义,若要在模板中加入html标签,则只需在模板变量后加上过滤器或一些特殊的模板标签即可(参见django book之高级模板用法),如下:</span></p><p></p><p></p><p><span style="font-size:24px">①:用safe过滤器为单独的变量关闭自动转意:</span></p><p><span style="font-size:24px"> 改正后的代码注意content的变化:</span></p><p><span style="font-size:24px"> </span><pre name="code" class="python">def test(request):
tem=Template('<html><body>{{content|safe}<body></html>')
format='''<table border='1'>
<tr>
<td>name</td>
</tr>
</table>'''
html=tem.render(Context({'content':format}))
return HttpResponse(html)
②使用模板标签来设置一整块模板的自动转意:
#关闭自动转意
{% autoescape off%}
.......
{% endautoescape %}
#打开自动转意
{% autoescape on%}
.......
{% endautoescape %}
PS:两个可以嵌套
如果大家还有更好的办法(自定义模板可能可以,不过暂时没有看到那里),请不吝赐教。