Как правильно применять фильтры шаблонов django / jinja2 'escape' и 'linebreak'? - PullRequest
4 голосов
/ 04 февраля 2011

В настоящее время я пытаюсь экранировать переменную с помощью шаблонных фильтров django, как показано ниже. Я использую шаблонизатор jinja2 вместо основного шаблонизатора django

{{ my_variable|escape|linebreaks }}

вывод строки с символами новой строки выглядит следующим образом:

Lorem ipsum <br /> dolor sit amet <br />rg srg
gs rgsr rsg serg<br />r srg

В идеале

<br />

не должен быть экранирован, так как он добавляется фильтром "разрывов строк". Нет тегов html с исходной строкой.

Я пробовал:

{{ my_variable|linebreaks|escape }}

Но, оказывается, еще хуже:

<p>Lorem ipsum <br /> dolor sit amet <br />rg srg</p>
<p>gs rgsr rsg serg<br />r srg</p>

Кто-нибудь знает, сделал ли я что-то не так с применением фильтра шаблонов и / или смог ли я указать мне правильное направление?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 04 февраля 2011

Итак, вы используете фильтр linebreaks от django в шаблоне jinja2? В этом случае я бы предположил, что способ, которым django помечает строку как безопасный, может быть несовместим с jinja2, поэтому экранирование тегов, добавленных django (если autoescape активен).

Что если вы добавили безопасный фильтр из jinja2 в конец?

{{ my_variable|escape|linebreaks|safe }}

В противном случае, в документации jinja2 есть пример пользовательского фильтра, который похож на разрывы строк в django. http://jinja.pocoo.org/docs/api/#custom-filters

import re
from jinja2 import evalcontextfilter, Markup, escape

_paragraph_re = re.compile(r'(?:\r\n|\r|\n){2,}')

@evalcontextfilter
def nl2br(eval_ctx, value):
    result = u'\n\n'.join(u'<p>%s</p>' % p.replace('\n', '<br>\n')
                      for p in _paragraph_re.split(escape(value)))
    if eval_ctx.autoescape:
        result = Markup(result)
    return result
2 голосов
/ 05 февраля 2011

Глупо, кажется, я могу использовать:

{{ my_variable|forceescape|linebreaks }}

, чтобы сначала применить фильтр 'escape'.По умолчанию 'escape' применяется только в конце всех других фильтров, независимо от позиции, поэтому force_escape является другой наиболее простой альтернативой.

...