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

Частичный вид колбы, такой как MVC 3

Есть ли что-то вроде .net MVC 3 частичный вид в колбе?
Я хочу встроить виджет на одну страницу просмотра, и этот виджет имеет свою собственную логику.

4b9b3361

Ответ 1

Существует несколько способов включить контент в шаблон Jinja2:

Оператор include отобразит предоставленное представление (с текущим контекстом по умолчанию):

{# In your_view_template.jinja #}
{# ... your code ... #}
{% include "widgets/your_widget.jinja" %}
{# ... your code ... #}

Вы также можете определить macros и import их в шаблон просмотра:

{# 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 ... #}

Вы можете даже создать собственный загрузчик шаблонов и загрузить разные шаблоны в зависимости от всего. Но это наверняка будет излишним для этого случая.