2013-08-20 2 views
1

Есть ли способ, чтобы полностью отключить Джанго auto_escaping при визуализации шаблона в коде вида (для электронной почты, например):как остановить Джанго код шаблона побега

from django.template import Context, Template 
subject_template_string = "Hi {{ customer.name }}" 
subject_template = Template(subject) 
context = Context({'customer':MyCustomerModel.objects.get(pk=1)}) 
subject = subject_template.render(context) 

Если customer.name это что-то вроде " Джек & Джилл»- тема выглядит как "Hi Jack & \ Amp; Джилл"(без обратной косой черты!)

есть что-то вроде

subject = subject_template.render(context, autoescape=False) 

редактирования: Фактические шаблоны создаются клиентом в базе данных, я надеюсь избежать того, чтобы сказать, добавить |safe ко всем шаблонам, где это может произойти ...

ответ

0

Отключение глобально, как правило, плохая идея, так как вы можете легко забыть об этом. Я бы рекомендовал использовать templatetag, чтобы отключить его для этой части вашего шаблона.

Что-то вроде этого:

{% autoescape off %} 
    This will not be auto-escaped: {{ data }}. 

    Nor this: {{ other_data }} 
    {% autoescape on %} 
     Auto-escaping applies again: {{ name }} 
    {% endautoescape %} 
{% endautoescape %} 
0

Используйте Джанго autoescape тег:

{% autoescape off %} 
    {{ body }} 
{% endautoescape %} 

для получения дополнительной информации, проверить документы here.

3

Как об использовании mark_safe:

Явных пометить строку как безопасную для вывода целей (HTML). Возвращаемый объект может использоваться везде, где объект string или unicode имеет значение .

Он знаменует собой строку в безопасности, поэтому, вы должны принять customer.name, и перейти к шаблону:

from django.utils.safestring import mark_safe 
customer = MyCustomerModel.objects.get(pk=1) 
context = Context({'customer_name': mark_safe(customer.name)}) 
subject = subject_template.render(context) 

Хотя, контролировать то, что это безопасно или нет, лучше делать внутри самого шаблона, поэтому рекомендуется использовать autoescape.

+0

Это хорошее решение, но требует много редактирования клиентов электронной почты. –

+0

@GuyBowden да, спасибо, я действительно предпочитаю делать работу там, где я должен - например, использовать 'autoescape' или' safe' в шаблоне. Шаблоны имеют дело с презентацией, да? – alecxe

0

Это не проверено, но на основе анализа исходного кода похоже, что объект контекста может принимать autoescape в качестве ключа.

context = Context({'customer':MyCustomerModel.objects.get(pk=1), 'autoescape': False}) 
subject = subject_template.render(context) 

Это сказало, что это довольно радикальное изменение. Если вы знаете, какие значения могут искать шаблоны, вероятно, лучше использовать mark_safe по этим значениям и передать в предопределенные параметры. Это будет иметь дополнительное преимущество, не рискуя возможности шаблона клиента, вызывающего метод с побочными эффектами для клиента. В первый раз, когда кто-то пишет шаблон и помещается в {{ customer.delete }}, у вас есть проблема.

0

Только что вернулся, чтобы ответить на мой вопрос простым решением, и было уже 4 ответа .. спасибо.

Это то, что я пошел с:

subject_template = Template(u'{%% autoescape off %%}%s{%% endautoescape %%}' % email.subject)

+0

Итак, 'email.subject' сам представляет собой строковое представление шаблона? –

+0

Yep - мое первоначальное редактирование ссылается на это. Клиент создает электронные письма в админе с темой и телом (и уже создал много), поэтому не хочет изменять способ их создания. –

+0

В этом случае это должно работать, за исключением того, что он будет разорваться, если 'email.subject' использует тег' {% extends%} 'для наследования другого шаблона. Скорее всего, это не очень вероятный сценарий. –

Смежные вопросы