我正在研究我的同事的Django(Django 2.1.4)项目之一。我花了几天的时间来尝试弄清楚在模板中手动呈现时如何禁用Form字段值的自动转义。 {% autoescape off %} and {{form1.LastName | safe }}
全部无效。
以下是一些相关代码。
Form.py
class tblstudentinfomodelform_page1(forms.ModelForm):
LastName = forms.CharField(max_length=30, required=True)
views.py
def application(request,application_num)
form1 = tblstudentinfo.objects.get(ApplicationNumber=application_num)
...
form1_forms = tblstudentinfomodelform_page1(initial=form1.__dict__) if form1 else tblstudentinfomodelform_page1(initial=form1)
...
return render(request,'appinfo.html',{'form1':form1_forms})
appinfo.html
<th>{{form1.LastName}}<br>{{form1.LastName.errors}} {{form1.LastName.value}} </th>
这里有一些测试:
姓氏的值为Şhaha
test1 :在模板顶部添加{% autoescape off %}
,在底部添加{% endautoescape %}
结果1 :{{form1.LastName.value}}
正确显示-Ş哈哈,但输入文本框显示Şhaha
run result -- html page
test2 :删除自动转义标记并添加safe
过滤器
<th>{{form1.LastName | safe}}<br>{{form1.LastName.errors}} {{form1.LastName.value |safe}} </th>
结果2 :获得相同的结果,看起来safe
过滤器仅适用于form.field.value
有什么建议吗?
谢谢。
答案 0 :(得分:0)
如果有人遇到相同的问题,请在此处添加答案。
创建一个函数以取消转义所有HTML实体。
from html import unescape
def html_unescape(data_model): # convert to unicode characters
# Convert all named and numeric character references (e.g. >, >, >) in the string s to the corresponding Unicode characters.
for f in data_model._meta.get_fields():
if ( f.get_internal_type() == "CharField" or f.get_internal_type() == "TextField") and getattr(data_model, f.name):
#some old records haved escaped many times
str = unescape(unescape(unescape(unescape(unescape(getattr(data_model, f.name))))))
setattr(data_model, f.name, str)
return data_model
然后
form1 = tblstudentinfo.objects.get(ApplicationNumber=application_num)
form1 = html_unescape(form1)