Spec-Zone.ru › Wagtail 3

Использование форм в админских представлениях

Фреймворк форм 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API