Как отключить автоматическое выключение HTML файла Django, когда я пишу в модель TextField?
Отключить HTML-экранирование в Django TextField
Ответ 1
Просто используйте django safe фильтр. В вашем шаблоне вы сделаете что-то вроде этого:
{{ instance.my_text_field|safe }}
Ответ 2
Один из способов сделать это - поместить функцию в вашу модель, которая возвращает данные, помеченные как безопасные:
from django.utils.safestring import mark_safe
class MyModel(models.Model):
my_textfield = models.TextField()
def display_my_safefield(self):
return mark_safe(self.my_textfield)
Затем в шаблоне вы должны будете использовать:
{{ instance.display_my_safefield }}
Ответ 3
Я думаю, что способ лучше сделать это, как описано @Daniel Vassallo.
Почему?
Таким образом, вы можете сделать несколько операций безопасности в HTML-коде, который вы хотите отображать, без экранирования, особенно для защиты от межсайтового скриптинга (XSS).
Например, вы можете проверить, содержит ли my_textfield
тег script. Если это так, отметьте экземпляр как вредоносный и верните экранированную версию my_textfield
(нормальное поведение Django).
В противном случае используйте mark_safe
, чтобы вернуть код HTML, помеченный как безопасный.
Здесь:
from django.utils.safestring import mark_safe
class MyModel(models.Model):
my_textfield = models.TextField()
is_malisious = models.BooleanField(default=False)
def display_my_safefield(self):
if '<script>' in self.my_textfield:
self.is_malicious = True
self.save()
return self.my_textfield
return mark_safe(self.my_textfield)
И все это не требует каких-либо переходов в базу данных.
Альтернативный подход
Я думаю, что вы можете сделать эту операцию безопасности, переопределив метод save()
вашей модели, включая проверку и любую другую необходимую операцию против вредоносного содержимого внутри нее. Затем вы можете использовать решение @bjunix, если вы обеспечите безопасность любого сохраненного содержимого.