Избегайте неоднозначных усов от 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.
Буду благодарен за мысли и отзывы. Спасибо, что прочитали.
Ответы
Ответ 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
.