그룹 편집/생성 뷰 사용자 정의

앱 내에서 그룹을 관리하는 뷰는 폼과 같이 해당 뷰의 모든 공유 구성 요소에 대한 단일 참조 지점 역할을 하는 ‘뷰셋’ 클래스로 수집됩니다. 뷰셋을 서브클래싱함으로써 이러한 구성 요소를 재정의하고 그룹 관리 인터페이스의 동작을 사용자 정의할 수 있습니다.

사용자 지정 편집/생성 폼

이 예제는 Wagtail 관리자에서 ‘그룹 편집’ 및 ‘그룹 생성’ 뷰의 폼을 사용자 정의하는 방법을 보여줍니다.

Active Directory 그룹을 Django 그룹과 연결해야 한다고 가정해 봅시다. Active Directory 그룹에 대한 모델을 다음과 같이 생성합니다.

# myapp/models.py
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 을 상속하고 새 필드를 추가합니다.

# myapp/forms.py
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

이제 기본 Wagtail GroupViewSet 클래스를 상속하고 get_form_class 메서드를 재정의하여 사용자 지정 폼을 그룹 뷰셋에 추가합니다.

# myapp/viewsets.py
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 %}

마지막으로, 사용자 지정 AppConfig 클래스를 설정하여 wagtail.users 애플리케이션이 사용자 지정 뷰셋을 사용하도록 구성합니다. 프로젝트 폴더(최상위 설정 및 URL 모듈을 포함하는 패키지) 내에 apps.py 를 생성하고(아직 존재하지 않는 경우) 다음을 추가합니다.

# myproject/apps.py
from wagtail.users.apps import WagtailUsersAppConfig


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

settings.INSTALLED_APPS 에서 wagtail.usersCustomUsersAppConfig 의 경로로 바꿉니다.

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

GroupViewSet 클래스는 ModelViewSet 의 서브클래스이므로 ModelViewSet에 사용할 수 있는 대부분의 사용자 지정을 지원합니다.

사용자 폼과 뷰는 유사한 방식으로 사용자 정의할 수 있습니다. 사용자 정의 UserViewSet 만들기를 참조하십시오.

그룹 편집기 권한 순서 사용자 정의

그룹 편집기의 “객체 권한” 및 “기타 권한” 섹션에 객체 유형이 나타나는 순서는 하나 이상의 AppConfig 정의에 해당 순서를 등록하여 구성할 수 있습니다. 순서 값은 일반적으로 0에서 999 사이의 정수이지만, 이는 강제되지 않습니다.

from django.apps import AppConfig


class MyProjectAdminAppConfig(AppConfig):
    name = "myproject_admin"
    verbose_name = "My Project Admin"

    def ready(self):
        from wagtail.users.permission_order import register

        register("gadgets.SprocketType", order=150)
        register("gadgets.ChainType", order=151)
        register("site_settings.Settings", order=160)

모델 클래스도 register() 에 전달할 수 있습니다.

명시적으로 순서가 지정되지 않은 모든 객체 유형은 app_labelmodel 에 따라 알파벳순으로 정렬되며, 구성된 순서가 있는 모든 객체 유형 뒤에 나열됩니다.