Django как сделать частичный рендер - PullRequest
37 голосов
/ 20 апреля 2011

Как мне вызвать метод представления с уровня шаблона, как частичный рендер в RoR?Проблема прекрасно проиллюстрирована в этом блоге .Я могу использовать include для включения шаблонов в шаблоны, но тогда мне нужно будет сопоставить имена всех переменных в слоях шаблонов.Я действительно хотел бы включить представления в шаблоны и разделить слои.Блог был написан год назад.Есть ли лучшее решение с тех пор?

Спасибо

Ответы [ 4 ]

54 голосов
/ 21 апреля 2011

Я думаю, что вы ищете {% include '_partial.html' %}.

28 голосов
/ 18 декабря 2012

https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#include

Если вы используете аргумент 'with' при включении частичного, вам не нужно сопоставлять переменные - вы можете переименовать переменную перед включением шаблона. Я обнаружил, что эта техника позволяет мне создавать гораздо более многократно используемые шаблоны. Также это гораздо меньше работы, чем создание тегов включения. Например:

{% include 'partials/blog_entry.html' with blog_entry=my_blog_entry %}
12 голосов
/ 20 апреля 2011

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

Теперь, с тегами включения , вы должны указать путь к шаблону для рендеринга. Django не найдет автоматически /your_app/views/_my_partial.html.erb, как в Rails.

Проверьте документы и посмотрите, будет ли это делать то, что вам нужно. Если нет, вы всегда можете написать свой собственный.

3 голосов
/ 19 июля 2014

Я адаптировал этот фрагмент и сделал его доступным в виде пакета pypi .

  1. pip install django_render_partial

  2. Добавить 'django_render_partial' к INSTALLED_APPS

  3. Убедитесь, что 'django.template.context_processors.request' находится в TEMPLATES['OPTIONS']['context_processors']

  4. Использование *Тег 1026 * в вашем шаблоне:

{% load render_partial %}

{# using view name from urls.py #}    
{% render_partial 'partial_view' arg1=40 arg2=some_var %}

{# using fully qualified view name #}
{% render_partial 'partial_test.views.partial_view' arg1=40 arg2=some_var %}

{# class based view #}
{% render_partial 'partial_test.views.PartialView' arg1=40 arg2=some_var %}

A Тестовый проект , содержащий эти примеры, доступен на GitHub.

...