Как предотвратить автоматическое удаление в шаблонах Django?

В документах говорится:

Единственными исключениями являются переменные, которые уже отмечены как "безопасные" от экранирования, либо кодом, заполняющим эту переменную, либо потому, что были применены безопасные или защищенные фильтры ".

Как работает часть "заполненная переменная"? Я действительно ищу способ объявить тег шаблона как безопасный в представлении. Я почему-то думаю, что это не очень хорошая идея, чтобы дизайнер решил. Мой коллега просто добавит его, когда она "думает", что это хорошая идея.

https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs

Ответ 1

Django имеет подкласс строк, называемых безопасными строками (в частности SafeUnicode или SafeString), которые могут быть созданы с помощью django.utils.safestring.mark_safe. Когда механизм шаблона попадает в безопасную строку, он не выполняет HTML-экранирование на нем:

>>> from django.utils.safestring import mark_safe
>>> from django.template import Template, Context
>>> Template("{{ name }}").render(Context({'name': mark_safe('<b>Brad</b>')}))
u"<b>Brad</b>"

Если вы пишете свой собственный тег шаблона, вам нужно реализовать render(), который вернет строку, которая будет считаться безопасной, что означает, что вам нужно самому справиться с любым возможным экранированием. Однако, если вы пишете фильтр шаблонов, вы можете установить атрибут is_safe = True на фильтр, чтобы избежать автоматического экранирования возвращаемого значения, например.

@register.filter
def myfilter(value):
    return value
myfilter.is_safe = True

Подробнее см. https://docs.djangoproject.com/en/1.3/howto/custom-template-tags/#filters-and-auto-escaping.

Ответ 2

Вы можете вызвать django.utils.safestring.mark_safe и передать переменную

...
return direct_to_template('my-template.html', {'safe_var': mark_safe('<script>alert("");</script>')})

В шаблоне он будет напечатан без экранирования (появится всплывающее окно предупреждения). Хотя авто-побег - действительно отличная функция, которая спасет вас от некоторых плохих вещей.