API рендеринга формы¶
Виджеты форм Django визуализируются с использованием системы шаблонизаторов Django.
Процесс рендеринга формы можно настроить на нескольких уровнях:
Виджеты могут указывать собственные имена шаблонов.
Формы и виджеты могут указывать собственные классы отрисовки.
Шаблон виджета может быть переопределен проектом. (Многократно используемые приложения обычно не должны переопределять встроенные шаблоны, поскольку они могут конфликтовать с пользовательскими шаблонами проекта.)
API низкоуровневого рендеринга¶
Отрисовка шаблонов форм контролируется настраиваемым классом отрисовки. Пользовательский рендерер можно указать, обновив настройку FORM_RENDERER. По умолчанию используется 'django.forms.renderers.DjangoTemplates'.
You can also provide a custom renderer by setting the
Form.default_renderer attribute or by using the renderer argument
of Widget.render().
Используйте один из встроенных средств визуализации форм шаблонов или реализуйте свой собственный. Пользовательские средства визуализации должны реализовать метод render(template_name, context, request=None). Он должен возвращать обработанные шаблоны (в виде строки) или вызывать TemplateDoesNotExist.
Встроенные средства рендеринга форм шаблонов.¶
DjangoTemplates¶
- class DjangoTemplates¶
This renderer uses a standalone
DjangoTemplates
engine (unconnected to what you might have configured in the
TEMPLATES setting). It loads templates first from the built-in form
templates directory in django/forms/templates and then from the installed
apps“ templates directories using the app_directories loader.
Если вы хотите визуализировать шаблоны с настройками из вашего параметра TEMPLATES, например, контекстные процессоры, используйте рендерер TemplatesSetting.
Джинджа2¶
- class Jinja2¶
This renderer is the same as the DjangoTemplates renderer except that
it uses a Jinja2 backend. Templates
for the built-in widgets are located in django/forms/jinja2 and installed
apps can provide templates in a jinja2 directory.
To use this backend, all the widgets in your project and its third-party apps
must have Jinja2 templates. Unless you provide your own Jinja2 templates for
widgets that don’t have any, you can’t use this renderer. For example,
django.contrib.admin doesn’t include Jinja2 templates for its widgets
due to their usage of Django template tags.
Настройка шаблонов¶
- class TemplatesSetting¶
This renderer gives you complete control of how widget templates are sourced.
It uses get_template() to find widget
templates based on what’s configured in the TEMPLATES setting.
Using this renderer along with the built-in widget templates requires either:
'django.forms'вINSTALLED_APPSи хотя бы один движок сAPP_DIRS=True.Adding the built-in widgets templates directory in
DIRSof one of your template engines. To generate that path:import django django.__path__[0] + '/forms/templates' # or '/forms/jinja2'
Использование этого средства визуализации требует от вас убедиться, что шаблоны форм, необходимые вашему проекту, могут быть найдены.
Контекст доступен в шаблонах виджетов¶
Шаблоны виджетов получают контекст из Widget.get_context(). По умолчанию виджеты получают в контексте одно значение — «виджет». Это словарь, который содержит такие значения, как:
namevalueатрисыis_hiddenимя_шаблона
Некоторые виджеты добавляют в контекст дополнительную информацию. Например, все виджеты, подкласс которых Input определяет widget['type'], а MultiWidget` определяет widget['subwidgets'] для целей цикла.
Переопределение встроенных шаблонов виджетов¶
Каждый виджет имеет атрибут «template_name» со значением, например «input.html». Встроенные шаблоны виджетов хранятся по пути django/forms/widgets. Вы можете предоставить собственный шаблон для input.html, например, определив django/forms/widgets/input.html. См. встроенные виджеты, чтобы узнать название шаблона каждого виджета.
Чтобы переопределить шаблоны виджетов, вы должны использовать рендерер TemplatesSetting. Тогда переопределение шаблонов виджетов работает так же, как переопределение любого другого шаблона в вашем проекте.