Настройка просмотров редактирования/создания групп
Просмотры для управления группами в приложении объединены в класс «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 %}
<li>{% include "wagtailadmin/shared/field.html" with field=form.adgroups %}</li>
{% endblock extra_fields %}
Наконец, мы настраиваем приложение wagtail.users для использования настраиваемого viewset, настроив класс AppConfig. Внутри папки вашего проекта (которая будет пакетом, содержащим модули верхнего уровня 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/stable/extending/customising_group_views.html