カスタムユーザーモデルを用いて、下記の認証方法を実装した時のメモです。
- 「ユーザー名」「パスワード」の2項目でログイン
- ユーザー登録は管理サイトからのみ
- メールアドレスによるアカウント登録確認は行わない
前提
django-allauthを用いた認証アプリケーションを既に作成している前提で進めます。
詳しくはこちら。
結論
models.py
from django.contrib.auth.models import AbstractUser
class CustomUser(AbstractUser):
class Meta:
verbose_name_plural = 'CustomUser'
AbstractUserを継承したカスタムユーザーモデルを作成しています。
admin.py
from django.contrib import admin
from django.contrib.auth import get_user_model
from django.contrib.auth.admin import UserAdmin
from django.utils.translation import gettext as _
class CustomUserAdmin(UserAdmin):
fieldsets = (
(None, {"fields": ("username", "password")}),
(_("Personal info"), {"fields": ("first_name", "last_name", "email")}),
(
_("Permissions"),
{
"fields": (
"is_active",
"is_staff",
"is_superuser",
"groups",
"user_permissions",
),
},
),
(_("Important dates"), {"fields": ("last_login", "date_joined")}),
)
add_fieldsets = (
(
None,
{
"classes": ("wide",),
"fields": ("username", "password1", "password2"),
},
),
)
list_display = ("username", "email", )
list_filter = ("is_staff", "is_superuser", "is_active", "groups")
search_fields = ("username", "first_name", "last_name", "email")
ordering = ("username",)
CustomUser = get_user_model()
admin.site.register(CustomUser, CustomUserAdmin)
UserAdminを継承した CustomUserAdmin を作成し、管理画面のカスタマイズを行なっています。
例えば下記の部分では、fieldsets をオーバーライドし、管理画面で表示させる項目をカスタマイズしています。
fieldsets = (
(None, {"fields": ("username", "password")}),
(_("Personal info"), {"fields": ("first_name", "last_name", "email")}),
(
_("Permissions"),
{
"fields": (
"is_active",
"is_staff",
"is_superuser",
"groups",
"user_permissions",
),
},
),
(_("Important dates"), {"fields": ("last_login", "date_joined")}),
)
settings.py
# 認証方式はユーザー名
ACCOUNT_AUTHENTICATION_METHOD = 'username'
ACCOUNT_USERNAME_REQUIRED = True
# サインアップにメールアドレス確認を挟まない
ACCOUNT_EMAIL_VERIFICATION = 'none'
ACCOUNT_EMAIL_REQUIRED = False
settings.pyで上記のように設定します。
login.html
<form method="post" action="{% url 'account_login' %}">
{% csrf_token %}
<div>
<label for="username"></label>
<input type="username" name="login" autocomplete="username" required id="id_login" placeholder="username">
</div>
<div>
<label for="password"></label>
<input type="password" name="password" autocomplete="current-password" required id="id_password" placeholder="password">
</div>
{% if redirect_field_value %}
<input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}">
{% endif %}
<button type="submit">ログイン</button>
</form>
最低限の情報のみ記載。
まとめ
備忘録ですので最低限の情報しか記述しておりません。
参考にさせていただいたサイトはこちらです、ありがとうございます。
コメント