ゆきねこです。
以前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件のコメント