API рендеринга форм¶
Виджеты форм Django отображаются с помощью template engines system.
Процесс визуализации формы может быть настроен на нескольких уровнях:
- Виджеты могут задавать собственные имена шаблонов.
- Формы и виджеты могут задавать пользовательские классы рендеринга.
- Шаблон виджета может быть переопределен проектом. (Многоразовые приложения обычно не должны переопределять встроенные шаблоны, поскольку они могут конфликтовать с пользовательскими шаблонами проекта).
Низкоуровневый API рендеринга¶
Рендеринг шаблонов форм контролируется настраиваемым классом renderer. Пользовательский рендерер может быть указан путем обновления параметра FORM_RENDERER. По умолчанию это значение равно 'django.forms.renderers.DjangoTemplates'.
Указав пользовательский рендерер формы и переопределив form_template_name, вы можете настроить разметку формы по умолчанию во всем проекте из одного места.
Вы также можете предоставить пользовательский рендерер для каждой формы или каждого виджета, установив атрибут Form.default_renderer или используя аргумент renderer в Form.render() или Widget.render().
Точки совпадения применяются к рендерингу набора форм. См. раздел Использование набора форм в представлениях и шаблонах для обсуждения.
Используйте один из built-in template form renderers или реализуйте свой собственный. Пользовательские рендереры должны реализовать метод render(template_name, context, request=None). Он должен возвращать отрендеренные шаблоны (в виде строки) или поднимать вопрос TemplateDoesNotExist.
-
class
BaseRenderer[исходный код]¶ Базовый класс для встроенных рендереров форм.
-
form_template_name¶ - New in Django 4.1.
Имя шаблона по умолчанию, который будет использоваться для отображения формы.
По умолчанию используется значение
"django/forms/default.html", которое является прокси для"django/forms/table.html".Не рекомендуется, начиная с версии 4.1.
Шаблон
"django/forms/default.html"устарел и будет удален в Django 5.0. В то время по умолчанию будет использоваться"django/forms/div.html".
-
formset_template_name¶ - New in Django 4.1.
Имя шаблона по умолчанию, который будет использоваться для отображения набора форм.
По умолчанию используется значение
"django/forms/formsets/default.html", которое является прокси для"django/forms/formsets/table.html".Не рекомендуется, начиная с версии 4.1.
Шаблон
"django/forms/formset/default.html"является устаревшим и будет удален в Django 5.0. По умолчанию будет использоваться шаблон"django/forms/formset/div.html".
-
get_template(template_name)[исходный код]¶ Подклассы должны реализовать этот метод с соответствующей логикой поиска шаблона.
-
render(template_name, context, request=None)[исходный код]¶ Верстает заданный шаблон, или выдает
TemplateDoesNotExist.
-
Встроенные шаблоны рендеринга форм¶
DjangoTemplates¶
-
class
DjangoTemplates[исходный код]¶
Этот рендерер использует отдельный движок DjangoTemplates (не связанный с тем, что вы могли настроить в настройках TEMPLATES). Он загружает шаблоны сначала из встроенной директории шаблонов форм в django/forms/templates, а затем из директорий шаблонов установленных приложений с помощью загрузчика app_directories.
Если вы хотите рендерить шаблоны с настройками из вашей настройки TEMPLATES, такими как, например, контекстные процессоры, используйте рендерер TemplatesSetting.
-
class
DjangoDivFormRenderer[исходный код]¶
Подкласс DjangoTemplates, определяющий form_template_name и formset_template_name как "django/forms/div.html" и "django/forms/formset/div.html" соответственно.
Это переходный рендерер для перехода на новые шаблоны на основе <div>, которые используются по умолчанию в Django 5.0.
Примените это через настройку FORM_RENDERER:
FORM_RENDERER = "django.forms.renderers.DjangoDivFormRenderer"
Когда шаблоны <div> станут шаблонами по умолчанию, этот переходный рендерер будет устаревшим и будет удален в Django 6.0. Объявление FORM_RENDERER может быть удалено в это время.
Jinja2¶
-
class
Jinja2[исходный код]¶
Этот рендерер аналогичен рендереру DjangoTemplates за исключением того, что он использует бэкенд Jinja2. Шаблоны для встроенных виджетов находятся в каталоге django/forms/jinja2, а установленные приложения могут предоставлять шаблоны в каталоге jinja2.
Чтобы использовать этот бэкенд, все формы и виджеты в вашем проекте и его сторонних приложениях должны иметь шаблоны Jinja2. Если вы не предоставите свои собственные шаблоны Jinja2 для виджетов, у которых их нет, вы не сможете использовать этот рендерер. Например, django.contrib.admin не включает шаблоны Jinja2 для своих виджетов из-за использования ими тегов шаблонов Django.
-
class
Jinja2DivFormRenderer[исходный код]¶
Переходный рендерер, как DjangoDivFormRenderer выше, но подкласс Jinja2 для использования с бэкендом Jinja2.
Примените это через настройку FORM_RENDERER:
FORM_RENDERER = "django.forms.renderers.Jinja2DivFormRenderer"
TemplatesSetting¶
-
class
TemplatesSetting[исходный код]¶
Этот рендерер дает вам полный контроль над тем, как будут искаться шаблоны форм и виджетов. Он использует get_template() для поиска шаблонов на основе того, что настроено в параметре TEMPLATES.
Использование этого рендерера вместе со встроенными шаблонами требует либо:
'django.forms'вINSTALLED_APPSи по крайней мере один двигатель сAPP_DIRS=True.Добавление каталога встроенных шаблонов в
DIRSодного из ваших шаблонизаторов. Чтобы сгенерировать этот путь:import django django.__path__[0] + "/forms/templates" # or '/forms/jinja2'
Использование этого рендерера требует, чтобы вы убедились, что шаблоны форм, необходимые вашему проекту, могут быть найдены.
Контекст, доступный в шаблонах наборов форм¶
Шаблоны формсета получают контекст из BaseFormSet.get_context(). По умолчанию шаблоны форм получают словарь со следующими значениями:
formset: экземпляр набора форм.
Контекст, доступный в шаблонах форм¶
Шаблоны форм получают контекст из Form.get_context(). По умолчанию формы получают словарь со следующими значениями:
form: Связанная форма.fields: Все связанные поля, кроме скрытых.hidden_fields: Все скрытые связанные поля.errors: Все ошибки формы, не связанные с полями или скрытыми полями.
Контекст, доступный в шаблонах виджетов¶
Шаблоны виджетов получают контекст Widget.get_context(). По умолчанию виджеты получают единственное значение в контексте, widget. Это словарь, который содержит такие значения, как:
namevalueattrsis_hiddentemplate_name
Некоторые виджеты добавляют дополнительную информацию к контексту. Например, все виджеты, подкласса Input, определяют widget['type'] и MultiWidget определяют widget['subwidgets'] для целей зацикливания.
Переопределение встроенных шаблонов наборов форм¶
Для переопределения шаблонов набора форм необходимо использовать рендерер TemplatesSetting. Тогда переопределение шаблонов набора форм работает the same as как переопределение любого другого шаблона в проекте.
Переопределение встроенных шаблонов форм¶
Для переопределения шаблонов форм необходимо использовать рендерер TemplatesSetting. Тогда переопределение шаблонов форм будет работать the same as как переопределение любого другого шаблона в проекте.
Переопределение встроенных шаблонов виджетов¶
Каждый виджет имеет атрибут template_name со значением, например input.html. Встроенные шаблоны виджетов хранятся в пути django/forms/widgets. Вы можете предоставить пользовательский шаблон для input.html, определив, например, django/forms/widgets/input.html. Имя шаблона каждого виджета смотрите в Встроенные виджеты.
Чтобы переопределить шаблоны виджетов, необходимо использовать рендерер TemplatesSetting. Тогда переопределение шаблонов виджетов работает как the same as переопределение любого другого шаблона в вашем проекте.