Как я могу создать тег в Jinja, который содержит значения позже в шаблоне? - PullRequest
3 голосов
/ 11 февраля 2009

Я использую Jinja2, и я пытаюсь создать пару тегов, которые работают вместе, так что если у меня есть шаблон, который выглядит примерно так:

{{ my_summary() }}
... arbitrary HTML ...
{{ my_values('Tom', 'Dick', 'Harry') }}
... arbitrary HTML ...
{{ my_values('Fred', 'Barney') }}

Я бы получил следующее:

This page includes information about <b>Tom</b>, <b>Dick</b>, <b>Harry</b>, <b>Fred</b>, and <b>Barney</b>.
... arbitrary HTML ...
<h1>Tom, Dick, and Harry</h1>
... arbitrary HTML ...
<h1>Fred and Barney</h1>

Другими словами, my_summary () в начале страницы содержит информацию, предоставленную позже на странице. Он должен быть достаточно умным, чтобы учесть выражения, которые встречаются и в операторах include и import.

Какой лучший способ сделать это?

1 Ответ

4 голосов
/ 11 февраля 2009

Отказ от ответственности: я не знаю, Джинджа.

Я предполагаю, что вы не можете (легко) сделать это.

Я бы предложил следующую альтернативу:

  • Передайте значения Тома, Дика и т. Д. Как переменные в шаблон извне.
  • Пусть ваши пользовательские теги принимают значения в качестве аргументов.
  • Я не знаю, что было бы "внешним" в вашем случае. Если шаблон используется в каркасе веб-приложения, «внешний», вероятно, является методом контроллера.
  • Например:

Шаблон:

{{ my_summary(list1 + list2) }}
... arbitrary HTML ...
{{ my_values(list1) }}
... arbitrary HTML ...
{{ my_values(list2) }}

Контроллер:

def a_controller_method(request):
    return render_template('templatefilename', {
        'list1': ['Dick', 'Tom', 'Harry'],
        'list2': ['Fred', 'Barney']})
  • Если передача значений извне невозможна, я предлагаю вам определить их в верхней части шаблона, например:
{% set list1 = ['Dick', ...] %}
{% set list2 = ['Fred', ...] %}
{{ my_summary(list1 + list2) }}
... arbitrary HTML ...
{{ my_values(list1) }}
... arbitrary HTML ...
{{ my_values(list2) }}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...