ゆきねこです。

以前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件のコメント

コメントを残す

メールアドレスが公開されることはありません。