# 사용자 정의 사용자 모델
이 페이지에서는 사용자 정의 사용자 모델을 수용하도록 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)를 참조하십시오.