Spec-Zone.ru › Wagtail 3

Настройка представлений редактирования/создания групп

Представления для управления группами в приложении собраны в классе «viewset», который служит единственной точкой отсчета для всех общих компонентов этих представлений, таких как формы. Наследуя viewset, можно переопределить эти компоненты и настроить поведение интерфейса управления группами.

Настраиваемые формы редактирования/создания

Этот пример показывает, как настроить формы на представлениях «редактирование группы» и «создание группы» в админке Wagtail.

Предположим, вам нужно связать группы Active Directory с группами Django. Создадим модель для групп Active Directory следующим образом:

from django.contrib.auth.models import Group
from django.db import models


class ADGroup(models.Model):
    guid = models.CharField(verbose_name="GUID", max_length=64, db_index=True, unique=True)
    name = models.CharField(verbose_name="Group", max_length=255)
    domain = models.CharField(verbose_name="Domain", max_length=255, db_index=True)
    description = models.TextField(verbose_name="Description", blank=True, null=True)
    roles = models.ManyToManyField(Group, verbose_name="Role", related_name="adgroups", blank=True)

  class Meta:
      verbose_name = "AD group"
      verbose_name_plural = "AD groups"

Однако, поля роли нет в представлении «редактирование» или «создание» группы Wagtail. Чтобы добавить его, унаследуйте от wagtail.users.forms.GroupForm и добавьте новое поле:

from django import forms

from wagtail.users.forms import GroupForm as WagtailGroupForm

from .models import ADGroup


class GroupForm(WagtailGroupForm):
    adgroups = forms.ModelMultipleChoiceField(
        label="AD groups",
        required=False,
        queryset=ADGroup.objects.order_by("name"),
    )

    class Meta(WagtailGroupForm.Meta):
        fields = WagtailGroupForm.Meta.fields + ("adgroups",)

    def __init__(self, initial=None, instance=None, **kwargs):
        if instance is not None:
            if initial is None:
                initial = {}
            initial["adgroups"] = instance.adgroups.all()
        super().__init__(initial=initial, instance=instance, **kwargs)

    def save(self, commit=True):
        instance = super().save()
        instance.adgroups.set(self.cleaned_data["adgroups"])
        return instance

Теперь добавьте свою настраиваемую форму в viewset представления группы, унаследовав от стандартного класса Wagtail GroupViewSet и переопределив метод get_form_class.

from wagtail.users.views.groups import GroupViewSet as WagtailGroupViewSet

from .forms import GroupForm


class GroupViewSet(WagtailGroupViewSet):
    def get_form_class(self, for_update=False):
        return GroupForm

Добавьте поле в шаблоны «редактирование»/«создание» группы:

{% extends "wagtailusers/groups/edit.html" %}
{% load wagtailusers_tags wagtailadmin_tags i18n %}

{% block extra_fields %}
    {% include "wagtailadmin/shared/field_as_li.html" with field=form.adgroups %}
{% endblock extra_fields %}

Наконец, настройте приложение wagtail.users для использования настраиваемого viewset, создав настраиваемый класс AppConfig. В папке вашего проекта (т.е. пакете, содержащем модули top-level settings и urls), создайте apps.py (если она ещё не существует) и добавьте:

from wagtail.users.apps import WagtailUsersAppConfig


class CustomUsersAppConfig(WagtailUsersAppConfig):
    group_viewset = "myapplication.someapp.viewsets.GroupViewSet"

Замените wagtail.users в settings.INSTALLED_APPS на путь к CustomUsersAppConfig.

INSTALLED_APPS = [
    ...,
    "myapplication.apps.CustomUsersAppConfig",
    # "wagtail.users",
    ...,
]

© 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/customising_group_views.html

Spec-Zone.ru

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