Есть ли что-то вроде .net MVC 3 частичный вид в колбе?
Я хочу встроить виджет на одну страницу просмотра, и этот виджет имеет свою собственную логику.
Частичный вид колбы, такой как MVC 3
Ответ 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 ... #}
Вы можете даже создать собственный загрузчик шаблонов и загрузить разные шаблоны в зависимости от всего. Но это наверняка будет излишним для этого случая.