Избегайте неоднозначных усов от Jinja2, который включает шаблоны JQuery - PullRequest
28 голосов
/ 25 февраля 2011

Я пытаюсь вставить шаблоны jQuery в Jinja2 шаблоны. Увы, они оба (в настройках по умолчанию) используют усы {{ & }} для обозначения выражений и литералов соответственно.

Я вставляю свои шаблоны jQuery в HTML с тегами script, например:

<script type='text/x-jquery-template'>
    <div>The people are:
         {{ each people }} 
          ${$value}
         {{ /each }}
    </div>
</script>

Однако, если вышеприведенное есть в шаблоне Jinja, оно отклоняется, потому что Jinja пытается интерпретировать each как литерал.

В сложившихся обстоятельствах (у нас уже много шаблонов) нецелесообразно менять начальный и конечный разделители Jinja2 для переменных. Кроме того, это сбивает с толку, снижает совместимость и требует дополнительного обучения. Желательно избегать этой опции.

Итак, две альтернативные вещи, о которых я подумал, чтобы решить эту проблему:

  1. Jinja2 избегает каждого '{{' и '}}', что я не совсем уверен, как сделать лучше ("{{" {{"}}`, возможно, но это многословно);

  2. Более практичным - возможно, идеальным - было бы сказать Jinja2 , а не анализировать блок кода, возможно, с помощью расширения jQuery.

Буду благодарен за мысли и отзывы. Спасибо за чтение.

Ответы [ 2 ]

54 голосов
/ 28 февраля 2011

Вы можете использовать конструкцию {% raw %}{% endraw %}, чтобы облегчить свои проблемы (прямо из Jinja2 документов ).

Пример:

<script type='text/x-jquery-template'>
    <div>The people are:
        {% raw %}<!-- Everything in here will be left untouched by Jinja2 -->

        {{ each people }} 
          ${$value}
        {{ /each }}

        {% endraw %}
    </div>
</script>
3 голосов
/ 04 апреля 2015

Я нашел это через google, когда экспериментировал с полимером, но мне не понравилось предлагаемое решение, поэтому есть еще один вариант: использовать фильтры.

В вашем коде python определите фильтр:

#Filter to create curly braces
@app.template_filter('curly')
def curly(value):
    #Handle value as string  {{'foo'|curly}}
    if(isinstance(value,str)):
        return_value = value
    #Handle value directly. {{foo|curly}}
    else:
        return_value = value._undefined_name
    return "{{" + return_value + "}}"

Тогда в вашем шаблоне вы можете использовать {{'foo'|curly}} или {{foo|curly}}

PS: Если вы не используете колбу, я думаю, что вы не можете использовать декоратор, но вместо этого нужно явно зарегистрировать фильтр: environment.filters['curly'] = curly.

...