2014-01-14 2 views
2

Я хотел бы написать свой собственный статический генератор страниц с помощью jinja2. Я хочу сделать что-то программно в определенном блоке. Я попытался это:Как сделать блок с помощью jinja2 API

import jinja2 

a = "adam" 
b = "bob" 

template = jinja2.Template(u"{{ A }} {% block b %}{% endblock %}") 

html = template.render({'A': a, 'B': b}) 

print(html) 

Но следующий вывод возвращается: adam. Как я могу визуализировать некоторый текст и/или переменные (например, переменную b) в блоке b.

+0

Благодарим за сжатый пример кода. Но можете ли вы быть более конкретным: ожидаете ли вы, что вывод будет 'adam', или вы получаете' adam', но ожидаете чего-то еще? –

+0

Я понимаю, что моя проблема заключается в том, «как сделать что-то в определенном блоке», я обновляю вопрос. – Kartoch

+0

Я немного растерялся, почему вы хотите это сделать. Почему бы просто не использовать '{{B}}'? Блоки, которые вы предоставили, обычно используются, когда вам нужно заполнить блок значением дочернего шаблона, который вы не используете. –

ответ

3

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

Однако при вызове render() в контексте шаблона, который вы передаете, определяются только переменные, которые используются внутри шаблона. Блоки не могут быть заполнены шаблонами, и поэтому ваш B не появится. Содержимое блока по-прежнему пуст и, как таковое, ничего не появится.

Если вы хотите отобразить содержимое переменной, вам нужно будет указать переменную, как и для A. Однако вы можете объединить оба и предоставить блок B с содержимым по умолчанию, являющимся переменным выходом. Затем в унаследованных шаблонах вы все равно можете перезаписать блок чем-то другим.

Btw .: блоки и переменные могут фактически иметь одно и то же имя, не конфликтуя друг с другом.

+0

Правильно: кроме 'b' должно быть' B' в блоке. –

+0

@MarkHildreth Right; или оба 'B', поскольку я на самом деле хотел подчеркнуть возможность называть их одинаково. Исправлено, спасибо :) – poke

Смежные вопросы