Подтвердить что ты не робот

Избегайте неоднозначных усов от Jinja2, который включает в себя шаблоны jQuery

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

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

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

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

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

Итак, две альтернативные вещи, которые я решил решить, следующие:

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

  • Более практичный - возможно, идеальный - говорит Jinja2 не анализировать блок кода, возможно, через расширение jQuery.

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

4b9b3361

Ответ 1

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

Пример:

<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>

Ответ 2

Я нашел это через 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.