Как отключить экранирование для значения поля модели Django в шаблоне при визуализации полей вручную - PullRequest
0 голосов
/ 26 февраля 2019

Я работаю над одним из проектов моего коллеги Django (Django 2.1.4).Я потратил пару дней, чтобы попытаться выяснить, как отключить автоматический экранирование для значения поля формы при его визуализации вручную в шаблоне.{% 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>

Некоторые тесты здесь:

Значение LastName равно &#350;haha

test1 : добавьте {% autoescape off %} вверху шаблона и {% endautoescape %} внизу

result1 : {{form1.LastName.value}} отображается правильно - Şhaha, но входное текстовое поле показывает &#350;haha результат выполнения - html страница

test2 : удалить тег autoescape и добавитьsafe filter

<th>{{form1.LastName | safe}}<br>{{form1.LastName.errors}} {{form1.LastName.value |safe}} </th>  

result2 : получить тот же результат, похоже, что safe фильтр работал только на form.field.value

Есть предложения?

Спасибо.

1 Ответ

0 голосов
/ 02 марта 2019

Добавьте ответ сюда, если у кого-то возникнет такая же проблема.

Создание функции для удаления всех 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)
...