(customizing_group_views)= # 그룹 편집/생성 뷰 사용자 정의 앱 내에서 그룹을 관리하는 뷰는 폼과 같이 해당 뷰의 모든 공유 구성 요소에 대한 단일 참조 지점 역할을 하는 '뷰셋' 클래스로 수집됩니다. 뷰셋을 서브클래싱함으로써 이러한 구성 요소를 재정의하고 그룹 관리 인터페이스의 동작을 사용자 정의할 수 있습니다. ## 사용자 지정 편집/생성 폼 이 예제는 Wagtail 관리자에서 '그룹 편집' 및 '그룹 생성' 뷰의 폼을 사용자 정의하는 방법을 보여줍니다. Active Directory 그룹을 Django 그룹과 연결해야 한다고 가정해 봅시다. Active Directory 그룹에 대한 모델을 다음과 같이 생성합니다. ```python # 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` 을 상속하고 새 필드를 추가합니다. ```python # 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` 메서드를 재정의하여 사용자 지정 폼을 그룹 뷰셋에 추가합니다. ```python # 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 ``` 그룹 '편집'/'생성' 템플릿에 필드를 추가합니다. ```html+django {% extends "wagtailusers/groups/edit.html" %} {% load wagtailusers_tags wagtailadmin_tags i18n %} {% block extra_fields %}
  • {% include "wagtailadmin/shared/field.html" with field=form.adgroups %}
  • {% endblock extra_fields %} ``` 마지막으로, 사용자 지정 `AppConfig` 클래스를 설정하여 `wagtail.users` 애플리케이션이 사용자 지정 뷰셋을 사용하도록 구성합니다. 프로젝트 폴더(최상위 설정 및 URL 모듈을 포함하는 패키지) 내에 `apps.py` 를 생성하고(아직 존재하지 않는 경우) 다음을 추가합니다. ```python # myproject/apps.py from wagtail.users.apps import WagtailUsersAppConfig class CustomUsersAppConfig(WagtailUsersAppConfig): group_viewset = "myapp.viewsets.GroupViewSet" ``` `settings.INSTALLED_APPS` 에서 `wagtail.users` 를 `CustomUsersAppConfig` 의 경로로 바꿉니다. ```python INSTALLED_APPS = [ ..., "myproject.apps.CustomUsersAppConfig", # "wagtail.users", ..., ] ``` `GroupViewSet` 클래스는 {class}`~wagtail.admin.viewsets.model.ModelViewSet` 의 서브클래스이므로 [ModelViewSet에 사용할 수 있는 대부분의 사용자 지정](./generic_views)을 지원합니다. 사용자 폼과 뷰는 유사한 방식으로 사용자 정의할 수 있습니다. [](custom_userviewset)를 참조하십시오. (customizing_group_views_permissions_order)= ## 그룹 편집기 권한 순서 사용자 정의 그룹 편집기의 "객체 권한" 및 "기타 권한" 섹션에 객체 유형이 나타나는 순서는 하나 이상의 `AppConfig` 정의에 해당 순서를 등록하여 구성할 수 있습니다. 순서 값은 일반적으로 0에서 999 사이의 정수이지만, 이는 강제되지 않습니다. ```python 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_label` 및 `model` 에 따라 알파벳순으로 정렬되며, 구성된 순서가 있는 모든 객체 유형 뒤에 나열됩니다.