はじめに
Djangoを用いたWebアプリケーションでユーザー登録機能を実装しました。
Djangoはデフォルトでユーザーモデルが設定されていますが、今回はDjango-Allauthを用いて実装。
実装内容とCustomUserを実装する上でのtipを書いていきます。
概要
ユーザー登録の基礎にはAllauthを使用。
CustomUserモデルの追加にはAbstractUserを使用。
Djangoでは、ユーザーモデルの変更にはAbstractUserとAbstractBaseUserのどちらかを継承する方法がりますが、今回の変更はフィールドの追加のみであり、かつ早く開発したかったためAbstractUserを使用しました。
usersアプリの追加
INSTALLED_APPS = [
(中略 以下追加)
#django-allauth
'allauth',
'allauth.account',
'allauth.socialaccount',
#myapp
'teamup_site',
]
...
AUTH_USER_MODEL = 'teamup_site.CustomUser' # 追加
Setting.pyのINSTALLED_APPに、今回用いるallauthを適応させます。
その下に、デフォルトのユーザーモデルではなく、teamup_webアプリ内のCustomUserモデルを使用すると記述します。
models
CustomUserモデルを作成していきます。
from django.db import models
from django.contrib.auth.models import AbstractUser,
from django.utils import timezone
from datetime import date
class Gender(models.TextChoices):
MAN = 'Man'
WOMEN = 'Women'
OTHER = 'Other'
class Work(models.TextChoices):
SOFTWARE_ENGINEER = 'Software Engineer'
DESIGNER = 'Designer'
PLANNER = 'Planer'
INFRASTRUCTURE_ENGINNER = 'Infrastructure Engineer'
DATA_ENGINNER = 'Data Engineer'
class CustomUser(AbstractUser, PermissionsMixin):
username = models.CharField(max_length=25)
WORK_CHOICES =[(w.value, w.name) for w in Work]
your_job = models.CharField(max_length=25, choices=WORK_CHOICES, default=Work.SOFTWARE_ENGINEER)
GENDER_CHOICES = [(g.value, g.name) for g in Gender]
your_gender = models.CharField(max_length=25, choices=GENDER_CHOICES, default=Gender.OTHER)
birth_date = models.DateField(blank=True, null=True,)
def __str__(self):
return self.username
書き方は、普通です。
特に追加する必要がない場合は、passで大丈夫です。
今回は、ユーザーの情報の他に職業の選択と性別の選択を追加しました。
どちらともTextChoicesを用いて列挙型で指定。
もし、デフォルトのユーザーモデルのみで良い場合でもCustomUserを作成することをおすすめします。
一度マイグレーションをするとDBの参照先モデルはデフオルトのユーザーモデルとなります。そこから追加したCustomUserモデルに変更するのはとても大変な作業なので、事前にCustomUserモデルを作成して参照先をそちらに変えておけば今後の変更等がより簡単になります。
forms
from django.contrib.auth.forms import UserCreationForm
from .models import CustomUser
class SignupForm(UserCreationForm):
class Meta(UserCreationForm.Meta):
model = CustomUser
fields = ["username", "email"]
ここではユーザー登録後、プロフィールページにて情報を入力すためのフォームを作成します。
とりあえず
admin
from django.contrib import admin
from .models import CustomUser
# Register your models here.
admin.site.register(CustomUser)
最後に、管理ページでCustomUserをCRUDするためにCustomUserを指定します。