• 3.1
  • 5.0
  • 6.1
  • Версия документации: 3.2

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 DIRS of one of your template engines. To generate that path:

    import django
    django.__path__[0] + '/forms/templates'  # or '/forms/jinja2'
    

Использование этого средства визуализации требует от вас убедиться, что шаблоны форм, необходимые вашему проекту, могут быть найдены.

Контекст доступен в шаблонах виджетов

Шаблоны виджетов получают контекст из Widget.get_context(). По умолчанию виджеты получают в контексте одно значение — «виджет». Это словарь, который содержит такие значения, как:

  • name

  • value

  • атрисы

  • is_hidden

  • имя_шаблона

Некоторые виджеты добавляют в контекст дополнительную информацию. Например, все виджеты, подкласс которых Input определяет widget['type'], а MultiWidget` определяет widget['subwidgets'] для целей цикла.

Переопределение встроенных шаблонов виджетов

Каждый виджет имеет атрибут «template_name» со значением, например «input.html». Встроенные шаблоны виджетов хранятся по пути django/forms/widgets. Вы можете предоставить собственный шаблон для input.html, например, определив django/forms/widgets/input.html. См. встроенные виджеты, чтобы узнать название шаблона каждого виджета.

Чтобы переопределить шаблоны виджетов, вы должны использовать рендерер TemplatesSetting. Тогда переопределение шаблонов виджетов работает так же, как переопределение любого другого шаблона в вашем проекте.

Back to Top