Отключить экранирование HTML в TextField в Django - PullRequest
30 голосов
/ 17 января 2010

Как отключить автоматическое экранирование HTML в Django при записи в TextField модели?

Ответы [ 3 ]

86 голосов
/ 15 февраля 2010

Просто используйте фильтр django . В вашем шаблоне вы бы сделали что-то вроде этого:

{{ instance.my_text_field|safe }}
16 голосов
/ 17 января 2010

Один из способов сделать это - добавить в модель функцию, которая возвращает данные, помеченные как безопасные:

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 }}
0 голосов
/ 27 октября 2017

Я думаю, что лучше способ сделать это, как описал @Daniel Vassallo.

Почему?

Таким образом, вы можете выполнить некоторые операции безопасности для HTML-кода, который вы хотите отобразить без экранирования, особенно для защиты от межсайтовых скриптов ( XSS ).

Например, вы можете проверить, содержит ли my_textfield тег script .
Если это так, пометьте экземпляр как вредоносный и верните экранированную версию my_textfield (нормальное поведение Django).
В противном случае используйте mark_safe, чтобы вернуть HTML-код, помеченный как safe .

Здесь:

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, если вы уверены, что любой сохраненный контент безопасен.

...