ゆきねこです。
以前djangoのユーザモデルの拡張方法を調べて結構苦労したのでユーザモデルの拡張方法について記述していきます。
ユーザを拡張するためには最初のマイグレーションの前に設定する必要があります。
まず、ユーザ用のアプリを以下のコマンドで作成します。
python manage.py startapp users
作成されたアプリのmodelsでuserを拡張していきます。
modelsを拡張する方法は以下の2通りあります。
- AbstractUserを拡張する
-
AbstractBaseUserを拡張する
AbstractUserを拡張する場合は継承して追記していくだけでいいのですが、AbstractBaseUserはPermissionsMixinも継承して定義する必要がある項目があります。
まず、AbstractUseの拡張方法は以下になります。
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
country = models.CharField(verbose_name='country', max_length=255)
AbstractBaseUserの拡張方法は以下になります。
from django.db import models
from django.contrib.auth.base_user import AbstractBaseUser
from django.contrib.auth.models import PermissionsMixin
from django.utils.translation import gettext_lazy as _
class User(AbstractBaseUser, PermissionsMixin):
username = models.CharField(
_('username'),
max_length=150,
unique=True,
help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'),
error_messages={
'unique': _("A user with that username already exists."),
},
)
is_active = models.BooleanField(
_('active'),
default=True,
help_text=_(
'Designates whether this user should be treated as active. '
'Unselect this instead of deleting accounts.'
),
)
USERNAME_FIELD = 'username'
country = models.CharField(verbose_name='country', max_length=255)
AbstractBaseUserを拡張する方法は自由度が大きいですが、必須項目がちょっとめんどくさい感じです。
次に作成したアプリ内にformを作成します。
from django import forms
from django.utils.translation import ugettext_lazy as _
from wagtail.users.forms import UserEditForm, UserCreationForm
class CustomUserEditForm(UserEditForm):
country = forms.CharField(required=True, label=_("Country"))
class CustomUserCreationForm(UserCreationForm):
country = forms.CharField(required=True, label=_("Country"))
そして拡張したmodelとformsを認識させるためにmysite/settings/base.pyに以下を加えます。
INSTALLED_APPS = [
...
'users',
...
]
.
.
.
AUTH_USER_MODEL = 'users.User'
WAGTAIL_USER_EDIT_FORM = 'users.forms.CustomUserEditForm'
WAGTAIL_USER_CREATION_FORM = 'users.forms.CustomUserCreationForm'
WAGTAIL_USER_CUSTOM_FIELDS = ['country']
ただ、このままでは管理画面に変化はありません。
以下のファイルを作成してオーバーライドすることで変更が反映されます。
/users/templates/wagtailusers/users/create.html
/users/templates/wagtailusers/users/edit.html
ファイルの中身はこんな感じにします。
{% extends "wagtailusers/users/create.html" %}
{% block extra_fields %}
{% include "wagtailadmin/shared/field_as_li.html" with field=form.country %}
{% endblock extra_fields %}
{% extends "wagtailusers/users/edit.html" %}
{% block extra_fields %}
{% include "wagtailadmin/shared/field_as_li.html" with field=form.country %}
{% endblock extra_fields %}
これでユーザの登録、変更画面にcountryが追加されます。
0件のコメント