Spec-Zone.ru › Wagtail

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

Структура форм 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 для определения содержимого и макета формы модели без необходимости написания шаблона. Они используются для интерфейса редактирования страниц и фрагментов, а также для модулей ModelAdmin и настроек сайта.

См. Типы панелей для набора типов панелей, предоставляемых Wagtail. Все панели наследуют от базового класса wagtail.admin.panels.Panel. Один объект панели (обычно ObjectList или TabbedInterface ) существует на верхнем уровне и является единственным, к которому непосредственно обращается код представления; панели, содержащие дочерние панели, наследуют от базового класса wagtail.admin.panels.PanelGroup и заботятся о рекурсивном вызове методов своих дочерних панелей, где это уместно.

Представление выполняет следующие шаги для отображения формы модели через механизм панелей:

  • Извлекается объект панели верхнего уровня для модели. Обычно это делается путем поиска свойства edit_handler модели и использования ObjectList из дочерних элементов, заданных свойством panels модели. Однако он может поступать и от других источников — например, модуль ModelAdmin позволяет определить его в объекте конфигурации ModelAdmin.
  • Если разрешения PanelsGroup не позволяют пользователю увидеть эту панель, больше никаких действий не будет выполнено.
  • Представление вызывает bind_to_model на панели верхнего уровня, передавая класс модели, и это возвращает клонированную панель со свойством model. В рамках этого процесса вызывается метод on_model_bound для каждой дочерней панели, чтобы она могла выполнить дополнительную инициализацию, требующую доступа к модели (например, именно здесь FieldPanel извлекает определение поля модели).
  • Затем представление вызывает get_form_class на панели верхнего уровня, чтобы получить подкласс ModelForm, который можно использовать для редактирования модели. Это происходит следующим образом:

    • Извлекается базовый класс формы из свойства base_form_class модели, в качестве резерва используется wagtail.admin.forms.WagtailAdminModelForm
    • Вызывается get_form_options для каждой дочерней панели — которая возвращает словарь свойств, включая fields и widgets, и результаты объединяются в единый словарь
    • Создается подкласс базового класса формы, где словарь options образует атрибуты внутреннего класса 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/stable/extending/forms.html

Spec-Zone.ru

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