手动渲染字段时如何在模板中禁用Django模型字段的值的转义

时间:2019-02-25 21:55:51

标签: python django django-forms django-templates

我正在研究我的同事的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>

这里有一些测试:

姓氏的值为&#350;haha

test1 :在模板顶部添加{% autoescape off %},在底部添加{% endautoescape %}

结果1 {{form1.LastName.value}}正确显示-Ş哈哈,但输入文本框显示&#350;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

有什么建议吗?

谢谢。

1 个答案:

答案 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. &gt;, &#62;, &#x3e;) 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)