Как отключить кодировку HTML при использовании контекста в django

В моем приложении django я использую шаблон для создания тела электронной почты, одним из параметров является url, обратите внимание, что есть два параметра, разделенных амперсандом в URL-адресе.

t = loader.get_template("sometemplate")
c = Context({
   'foo': 'bar',
   'url': 'http://127.0.0.1/test?a=1&b=2',
})
print t.render(c)

После рендеринга он производит: http://127.0.0.1/test?a=1&b=2

Обратите внимание, что амперсанд HTML кодируется как "& amp;". Один из способов решения этой проблемы - передать каждый параметр отдельно моему шаблону и построить URL-адрес в шаблоне, однако я бы хотел избежать этого.

Есть ли способ отключить кодирование HTML параметров контекста или, по крайней мере, избежать кодирования амперсандов?

Ответы

Ответ 1

Чтобы отключить его для одной переменной, используйте mark_safe:

from django.utils.safestring import mark_safe

t = loader.get_template("sometemplate")
c = Context({
   'foo': 'bar',
   'url': mark_safe('http://127.0.0.1/test?a=1&b=2'),
})
print t.render(c)

В качестве альтернативы, чтобы полностью отключить autoescaping от вашего кода Python, используйте аргумент autoescape при инициализации Context:

c = Context({
   'foo': 'bar',
   'url': 'http://127.0.0.1/test?a=1&b=2',
}, autoescape=False)

Как отключить раздел [Автоматическое удаление HTML] в документации содержит некоторые опции в шаблоне, если вы предпочитаете делать это там.

Ответ 2

Или просто используйте "безопасный" фильтр в своем шаблоне.

Кроме того, я не могу достаточно подчеркнуть, насколько важно быть знакомым с документацией Django; многие общие вопросы, подобные этому, имеют легко найти ответы и объяснения (как этот), и читать через документы и получать представление о том, как все работает, значительно сократит время, которое вам нужно потратить, спросите "зачем оно это делало" и увеличивайте время, затрачиваемое на строительство вещей, которые работают так, как вы хотите.