Использование форм в админских представлениях
Фреймворк форм Django можно использовать в админских представлениях Wagtail так же, как и в любом другом приложении Django. Однако Wagtail также предоставляет различные специфичные для админки виджеты форм, такие как выборщики дат/времени и выбора для страниц, документов, изображений и фрагментов. Конструируя формы, используя wagtail.admin.forms.models.WagtailAdminModelForm в качестве базового класса вместо django.forms.models.ModelForm, будет выбран наиболее подходящий виджет для каждого поля модели. Например, при заданных определении модели и формы:
from django.db import models
from wagtail.admin.forms.models import WagtailAdminModelForm
from wagtail.images.models import Image
class FeaturedImage(models.Model):
date = models.DateField()
image = models.ForeignKey(Image, on_delete=models.CASCADE)
class FeaturedImageForm(WagtailAdminModelForm):
class Meta:
model = FeaturedImage
поля date и image в форме будут использовать виджет выбора даты и выбора изображения соответственно.
Определение виджетов форм админки
Если вы реализовали собственный виджет формы, вы можете настроить WagtailAdminModelForm для его выбора для заданного типа поля модели. Это делается вызовом функции wagtail.admin.forms.models.register_form_field_override, обычно в методе AppConfig.ready.
Например, если приложение wagtail.videos реализует модель Video и виджет формы VideoChooser, следующее определение AppConfig гарантирует, что WagtailAdminModelForm выберет VideoChooser в качестве виджета формы для всех внешних ключей, указывающих на Video.
from django.apps import AppConfig
from django.db.models import ForeignKey
class WagtailVideosAppConfig(AppConfig):
name = 'wagtail.videos'
label = 'wagtailvideos'
def ready(self):
from wagtail.admin.forms.models import register_form_field_override
from .models import Video
from .widgets import VideoChooser
register_form_field_override(ForeignKey, to=Video, override={'widget': VideoChooser})
Стандартные представления Wagtail для редактирования страниц, фрагментов и ModelAdmin используют WagtailAdminModelForm, поэтому это изменение вступит в силу во всей админке Wagtail; внешний ключ к Video в модели страницы автоматически будет использовать виджет VideoChooser, без необходимости явного указания.
Панели
Панели (также известные как обработчики редактирования до Wagtail 3.0) — это механизм Wagtail для указания содержимого и макета формы модели без необходимости написания шаблона. Они используются для интерфейса редактирования страниц и фрагментов, а также для модулей contrib ModelAdmin и настроек сайта.
См. Типы панелей для набора типов панелей, предоставляемых Wagtail. Все панели наследуют от базового класса wagtail.admin.panels.Panel. Один объект панели (обычно ObjectList или TabbedInterface) существует на верхнем уровне и является единственным напрямую используемым кодом представления; панели, содержащие дочерние панели, наследуют от базового класса wagtail.admin.panels.PanelGroup и заботятся о рекурсивном вызове методов на дочерних панелях, где это уместно.
Представление выполняет следующие шаги для рендеринга формы модели через механизм панелей:
- Получается объект панели верхнего уровня для модели. Обычно это делается путем поиска свойства
edit_handlerмодели и возврата кObjectList, состоящему из дочерних элементов, заданных свойством моделиpanels. Однако он может поступать от других источников — например, модуль ModelAdmin позволяет определить его в объекте конфигурации ModelAdmin. - Представление вызывает
bind_to_modelна объекте панели верхнего уровня, передавая класс модели, и это возвращает клон панели со свойствомmodel. В рамках этого процесса вызывается методon_model_boundна каждой дочерней панели, чтобы позволить ей выполнить дополнительную инициализацию, требующую доступа к модели (например, здесьFieldPanelполучает определение поля модели). -
Затем представление вызывает
get_form_classна панели верхнего уровня для получения подкласса ModelForm, который можно использовать для редактирования модели. Это происходит следующим образом:- Получение базового класса формы из свойства
base_form_classмодели, возвращаясь кwagtail.admin.forms.WagtailAdminModelForm - Вызов
get_form_optionsна каждой дочерней панели — который возвращает словарь свойств, включаяfieldsиwidgets, и объединяет результаты в один словарь - Создание подкласса базового класса формы, при этом словарь опций формирует атрибуты внутреннего класса
Meta.
- Получение базового класса формы из свойства
- Создается экземпляр класса формы, как и в обычном представлении формы Django.
- Затем представление вызывает
get_bound_panelна панели верхнего уровня, передаваяinstance,formиrequestв качестве ключевых аргументов. Это возвращает объектBoundPanel, который следует API компонентов шаблона. Наконец, объектBoundPanel(и его определение медиа) отображается в шаблоне.
Новые типы панелей могут быть определены путем наследования от wagtail.admin.panels.Panel — см. API панелей.
© 2014-present Torchbox Ltd and individual contributors.
All rights are reserved.
Licensed under the BSD License.
https://docs.wagtail.org/en/v3.0.3/extending/forms.html