# 사용자 정의 사용자 모델 이 페이지에서는 사용자 정의 사용자 모델을 수용하도록 Wagtail을 구성하는 방법을 보여줍니다. ## 사용자 정의 사용자 모델 만들기 이 예에서는 텍스트 필드와 외래 키 필드를 추가하는 사용자 정의 사용자 모델을 사용합니다. 사용자 정의 사용자 모델은 최소한 {class}`~django.contrib.auth.models.AbstractBaseUser` 및 {class}`~django.contrib.auth.models.PermissionsMixin` 에서 상속해야 합니다. 이 경우 {class}`~django.contrib.auth.models.AbstractUser` 클래스를 확장하고 두 개의 필드를 추가합니다. 외래 키는 다른 모델(표시되지 않음)을 참조합니다. ```python # myapp/models.py from django.contrib.auth.models import AbstractUser class User(AbstractUser): country = models.CharField(verbose_name='country', max_length=255) status = models.ForeignKey(MembershipStatus, on_delete=models.SET_NULL, null=True, default=1) ``` 사용자 모델을 포함하는 앱을 `INSTALLED_APPS` 에 추가합니다. Wagtail의 내장 템플릿을 재정의하려면 `'wagtail.users'` 줄 위에 있어야 합니다. 그리고 [`AUTH_USER_MODEL`](inv:django#auth-custom-user)을 모델을 참조하도록 설정합니다. 이 예에서 앱 이름은 `myapp` 이고 모델은 `User` 입니다. ```python AUTH_USER_MODEL = 'myapp.User' ``` ## 사용자 정의 사용자 양식 만들기 이제 사용자 정의 필드의 값을 업데이트할 수 있도록 Wagtail의 사용자 양식을 구성해야 합니다. 앱에서 사용자 정의 사용자 '만들기' 및 '편집' 양식을 만듭니다. ```python # myapp/forms.py from django import forms from django.utils.translation import gettext_lazy as _ from wagtail.users.forms import UserEditForm, UserCreationForm from myapp.models import MembershipStatus class CustomUserEditForm(UserEditForm): status = forms.ModelChoiceField(queryset=MembershipStatus.objects, required=True, label=_("Status")) # 모델의 `country` 필드에 대해 ModelForm의 자동 양식 필드 생성을 사용하지만, # `status` 에 대해서는 명시적인 사용자 정의 양식 필드를 사용합니다. class Meta(UserEditForm.Meta): fields = UserEditForm.Meta.fields | {"country", "status"} class CustomUserCreationForm(UserCreationForm): status = forms.ModelChoiceField(queryset=MembershipStatus.objects, required=True, label=_("Status")) # 모델의 `country` 필드에 대해 ModelForm의 자동 양식 필드 생성을 사용하지만, # `status` 에 대해서는 명시적인 사용자 정의 양식 필드를 사용합니다. class Meta(UserCreationForm.Meta): fields = UserCreationForm.Meta.fields | {"country", "status"} ``` ## 만들기 및 편집 템플릿 확장 Wagtail 사용자 '만들기' 및 '편집' 템플릿을 확장합니다. 이러한 확장된 템플릿은 템플릿 디렉터리 `wagtailusers/users` 에 배치해야 합니다. 사용자 정의 템플릿 디렉터리를 사용하는 것은 가능하며 나중에 설명하겠습니다. 템플릿 create.html: ```html+django {% extends "wagtailusers/users/create.html" %} {% block extra_fields %}
  • {% include "wagtailadmin/shared/field.html" with field=form.country %}
  • {% include "wagtailadmin/shared/field.html" with field=form.status %}
  • {% endblock extra_fields %} ``` 템플릿 edit.html: ```html+django {% extends "wagtailusers/users/edit.html" %} {% block extra_fields %}
  • {% include "wagtailadmin/shared/field.html" with field=form.country %}
  • {% include "wagtailadmin/shared/field.html" with field=form.status %}
  • {% endblock extra_fields %} ``` `extra_fields` 블록을 사용하면 기본 템플릿의 `last_name` 필드 아래에 필드를 삽입할 수 있습니다. 기존 필드의 끝이나 시작에 필드를 추가하거나 모든 필드를 재정의할 수 있는 `fields` 블록이 있습니다. (custom_userviewset)= ## 사용자 정의 `UserViewSet` 만들기 사용자 정의 양식을 사용하려면 `UserViewSet` 하위 클래스를 만듭니다. ```python # myapp/viewsets.py from wagtail.users.views.users import UserViewSet as WagtailUserViewSet from .forms import CustomUserCreationForm, CustomUserEditForm class UserViewSet(WagtailUserViewSet): def get_form_class(self, for_update=False): if for_update: return CustomUserEditForm return CustomUserCreationForm ``` 그런 다음 사용자 정의 `AppConfig` 클래스를 설정하여 `wagtail.users` 애플리케이션이 사용자 정의 뷰셋을 사용하도록 구성합니다. 프로젝트 폴더(최상위 설정 및 URL 모듈을 포함하는 패키지) 내에서 `apps.py`(없는 경우)를 만들고 다음을 추가합니다. ```python # myproject/apps.py from wagtail.users.apps import WagtailUsersAppConfig class CustomUsersAppConfig(WagtailUsersAppConfig): user_viewset = "myapp.viewsets.UserViewSet" ``` `settings.INSTALLED_APPS` 의 `wagtail.users` 를 `CustomUsersAppConfig` 의 경로로 바꿉니다. ```python INSTALLED_APPS = [ ..., # 다음에 대해 두 개의 별도 항목이 있는지 확인하십시오. "myapp", # 사용자 정의 사용자 모델을 포함하는 앱 "myproject.apps.CustomUsersAppConfig", # wagtail.users 앱에 대한 사용자 정의 앱 구성 # "wagtail.users", # 사용자 정의 앱 구성 대신 제거해야 합니다. ..., ] ``` ```{warning} `WagtailUsersAppConfig` 하위 클래스를 사용자 정의 사용자 모델 앱의 동일한 `apps.py` 파일에 배치할 수도 있지만( `myproject/apps.py` 파일 대신) 주의해야 합니다. 기존 `AppConfig` 하위 클래스를 `WagtailUsersAppConfig` 하위 클래스로 바꾸는 대신 두 개의 별도 구성 클래스를 사용해야 합니다. 그렇게 하면 Django가 사용자 정의 사용자 모델을 `wagtail.users` 의 일부로 인식하게 됩니다. 또한 `INSTALLED_APPS` 에서 앱의 `AppConfig` 하위 클래스에 대한 점으로 구분된 경로를 이미 사용하지 않는 한 자신의 앱의 `AppConfig` 에서 {attr}`~django.apps.AppConfig.default` 를 `True` 로 설정해야 할 수도 있습니다. ``` `UserViewSet` 클래스는 {class}`~wagtail.admin.viewsets.model.ModelViewSet` 의 하위 클래스이므로 [`ModelViewSet` 에 사용할 수 있는 대부분의 사용자 정의](generic_views)를 지원합니다. 예를 들어 {attr}`~wagtail.admin.viewsets.model.ModelViewSet.template_prefix` 를 설정하여 템플릿에 대한 사용자 정의 디렉터리를 사용할 수 있습니다. ```py class UserViewSet(WagtailUserViewSet): template_prefix = "myapp/users/" ``` 또는 만들기 및 편집 템플릿을 구체적으로 사용자 정의합니다. ```py class UserViewSet(WagtailUserViewSet): create_template_name = "myapp/users/create.html" edit_template_name = "myapp/users/edit.html" ``` 그룹 양식 및 보기는 비슷한 방식으로 사용자 정의할 수 있습니다. [](customizing_group_views)를 참조하십시오.