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¶ Имя шаблона по умолчанию, который будет использоваться для отображения формы.
По умолчанию используется шаблон
"django/forms/div.html".
-
formset_template_name¶ Имя шаблона по умолчанию, который будет использоваться для отображения набора форм.
По умолчанию используется шаблон
"django/forms/formsets/div.html".
-
field_template_name¶ - New in Django 5.0.
Имя шаблона по умолчанию, используемого для отображения
BoundField.По умолчанию
"django/forms/field.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[исходный код]¶
Не рекомендуется, начиная с версии 5.0.
Псевдоним DjangoTemplates.
Jinja2¶
-
class
Jinja2[исходный код]¶
Этот рендерер аналогичен рендереру DjangoTemplates за исключением того, что он использует бэкенд Jinja2. Шаблоны для встроенных виджетов находятся в каталоге django/forms/jinja2, а установленные приложения могут предоставлять шаблоны в каталоге jinja2.
Чтобы использовать этот бэкенд, все формы и виджеты в вашем проекте и его сторонних приложениях должны иметь шаблоны Jinja2. Если вы не предоставите свои собственные шаблоны Jinja2 для виджетов, у которых их нет, вы не сможете использовать этот рендерер. Например, django.contrib.admin не включает шаблоны Jinja2 для своих виджетов из-за использования ими тегов шаблонов Django.
-
class
Jinja2DivFormRenderer[исходный код]¶
Не рекомендуется, начиная с версии 5.0.
Псевдоним Jinja2.
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: Все ошибки формы, не связанные с полями или скрытыми полями.
Контекст, доступный в шаблонах полей¶
Шаблоны полей получают контекст из BoundField.get_context(). По умолчанию поля получают словарь со следующими значениями:
field:BoundField.
Контекст, доступный в шаблонах виджетов¶
Шаблоны виджетов получают контекст Widget.get_context(). По умолчанию виджеты получают единственное значение в контексте, widget. Это словарь, который содержит такие значения, как:
namevalueattrsis_hiddentemplate_name
Некоторые виджеты добавляют дополнительную информацию к контексту. Например, все виджеты, подкласса Input, определяют widget['type'] и MultiWidget определяют widget['subwidgets'] для целей зацикливания.
Переопределение встроенных шаблонов наборов форм¶
Для переопределения шаблонов набора форм необходимо использовать рендерер TemplatesSetting. Тогда переопределение шаблонов набора форм работает the same as как переопределение любого другого шаблона в проекте.
Переопределение встроенных шаблонов форм¶
Для переопределения шаблонов форм необходимо использовать рендерер 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 переопределение любого другого шаблона в вашем проекте.