Есть несколько способов включить контент в шаблон Jinja2:
Оператор include
отобразит предоставленное представление (с текущим контекстом по умолчанию):
{# In your_view_template.jinja #}
{# ... your code ... #}
{% include "widgets/your_widget.jinja" %}
{# ... your code ... #}
Вы также можете определить макросы и , импортировать их в шаблон представления:
{# In your_view_template.jinja #}
{% import "widgets/your_widget.jinja" as your_widget %}
{# ... your code ... #}
{{ you_widget.render(your, important, variables, etc.) }}
{# ... your code ... #}
И import
, и include
могут использовать переменные, поэтому возможно что-то подобное:
# In your view
if complex_conditions.are_true():
widget = "widgets/special_custom_widget.jinja"
else:
widget = "widgets/boring_widget.jinja"
render_template("your_view.jinja", widget=widget)
{# In your_view_template.jinja #}
{% include widget %}
{#
import widget as sidebar_widget
{{ sidebar_widget.render() }}
would also work
#}
Они оба работают аналогично частичным представлениям MVC (по крайней мере, насколько я их понимаю)
В качестве альтернативы, если вашему виджету необходим доступ к спискам ACL или информации, которая не должна быть доступна для слоя шаблона, и вы не можете переписать свое представление, чтобы воспользоваться include
и import
, вы можете использовать @ [Alex Morega] предложите и передайте вызываемый объект как переменную в шаблон и отобразите его там.
# In your view
render_template("your_view.jinja", widget=you_callable, etc, etc, etc)
{# In your_view_template.jinja #}
{# ... your code ... #}
{{ widget() }}
{# Or, if you are returning HTML that is not a Markup construct #}
{{ widget() | safe }}
{# ... your code ... #}
Вы можете даже создать свой собственный загрузчик шаблонов и загружать различные шаблоны в зависимости от почти всего . Но это определенно было бы излишним для этого случая.