사용자 정의 사용자 모델¶
이 페이지에서는 사용자 정의 사용자 모델을 수용하도록 Wagtail을 구성하는 방법을 보여줍니다.
사용자 정의 사용자 모델 만들기¶
이 예에서는 텍스트 필드와 외래 키 필드를 추가하는 사용자 정의 사용자 모델을 사용합니다.
사용자 정의 사용자 모델은 최소한 AbstractBaseUser 및 PermissionsMixin 에서 상속해야 합니다. 이 경우 AbstractUser 클래스를 확장하고 두 개의 필드를 추가합니다. 외래 키는 다른 모델(표시되지 않음)을 참조합니다.
# 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을 모델을 참조하도록 설정합니다. 이 예에서 앱 이름은 myapp 이고 모델은 User 입니다.
AUTH_USER_MODEL = 'myapp.User'
사용자 정의 사용자 양식 만들기¶
이제 사용자 정의 필드의 값을 업데이트할 수 있도록 Wagtail의 사용자 양식을 구성해야 합니다. 앱에서 사용자 정의 사용자 ‘만들기’ 및 ‘편집’ 양식을 만듭니다.
# 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:
{% extends "wagtailusers/users/create.html" %}
{% block extra_fields %}
<li>{% include "wagtailadmin/shared/field.html" with field=form.country %}</li>
<li>{% include "wagtailadmin/shared/field.html" with field=form.status %}</li>
{% endblock extra_fields %}
템플릿 edit.html:
{% extends "wagtailusers/users/edit.html" %}
{% block extra_fields %}
<li>{% include "wagtailadmin/shared/field.html" with field=form.country %}</li>
<li>{% include "wagtailadmin/shared/field.html" with field=form.status %}</li>
{% endblock extra_fields %}
extra_fields 블록을 사용하면 기본 템플릿의 last_name 필드 아래에 필드를 삽입할 수 있습니다. 기존 필드의 끝이나 시작에 필드를 추가하거나 모든 필드를 재정의할 수 있는 fields 블록이 있습니다.
사용자 정의 UserViewSet 만들기¶
사용자 정의 양식을 사용하려면 UserViewSet 하위 클래스를 만듭니다.
# 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(없는 경우)를 만들고 다음을 추가합니다.
# myproject/apps.py
from wagtail.users.apps import WagtailUsersAppConfig
class CustomUsersAppConfig(WagtailUsersAppConfig):
user_viewset = "myapp.viewsets.UserViewSet"
settings.INSTALLED_APPS 의 wagtail.users 를 CustomUsersAppConfig 의 경로로 바꿉니다.
INSTALLED_APPS = [
...,
# 다음에 대해 두 개의 별도 항목이 있는지 확인하십시오.
"myapp", # 사용자 정의 사용자 모델을 포함하는 앱
"myproject.apps.CustomUsersAppConfig", # wagtail.users 앱에 대한 사용자 정의 앱 구성
# "wagtail.users", # 사용자 정의 앱 구성 대신 제거해야 합니다.
...,
]
경고
WagtailUsersAppConfig 하위 클래스를 사용자 정의 사용자 모델 앱의 동일한 apps.py 파일에 배치할 수도 있지만( myproject/apps.py 파일 대신) 주의해야 합니다. 기존 AppConfig 하위 클래스를 WagtailUsersAppConfig 하위 클래스로 바꾸는 대신 두 개의 별도 구성 클래스를 사용해야 합니다. 그렇게 하면 Django가 사용자 정의 사용자 모델을 wagtail.users 의 일부로 인식하게 됩니다. 또한 INSTALLED_APPS 에서 앱의 AppConfig 하위 클래스에 대한 점으로 구분된 경로를 이미 사용하지 않는 한 자신의 앱의 AppConfig 에서 default 를 True 로 설정해야 할 수도 있습니다.
UserViewSet 클래스는 ModelViewSet 의 하위 클래스이므로 ModelViewSet 에 사용할 수 있는 대부분의 사용자 정의를 지원합니다. 예를 들어 template_prefix 를 설정하여 템플릿에 대한 사용자 정의 디렉터리를 사용할 수 있습니다.
class UserViewSet(WagtailUserViewSet):
template_prefix = "myapp/users/"
또는 만들기 및 편집 템플릿을 구체적으로 사용자 정의합니다.
class UserViewSet(WagtailUserViewSet):
create_template_name = "myapp/users/create.html"
edit_template_name = "myapp/users/edit.html"
그룹 양식 및 보기는 비슷한 방식으로 사용자 정의할 수 있습니다. 그룹 편집/생성 뷰 사용자 정의를 참조하십시오.