Использование Email вместо имени пользователя для входа в Django Admin
По умолчанию, Django использует имя пользователя для входа в систему. Однако, в некоторых случаях использование email может быть более удобным и практичным. Например, большинство пользователей помнят свой email, а не имя пользователя. В этой статье мы рассмотрим, как настроить вход в Django с использованием email вместо имени пользователя.
Зачем использовать email вместо имени пользователя?
Использование email вместо имени пользователя имеет несколько преимуществ:
- Email является уникальным идентификатором, что означает, что каждый пользователь может иметь только один email-адрес.
- Пользователи чаще помнят свой email, чем имя пользователя.
- Email может быть использован для восстановления пароля и других операций.
Шаг 1: Создание пользовательской модели наследованную от AbstractUser.
В этой модели вы можете добавить дополнительные поля или изменить существующие. Поле электронной почты должно быть установлено как уникальное поле.
# models.py
from django.contrib.auth.models import AbstractUser
from django.db import models
from django.utils.translation import gettext_lazy as _
from apps.profiles.managers import CustomUserManager
class CustomUser(AbstractUser):
username = None
email = models.EmailField(_("Email address"), unique=True)
USERNAME_FIELD = "email"
REQUIRED_FIELDS = []
objects = CustomUserManager()
def __str__(self):
return self.email
Шаг 2: Определить менеджер для пользовательской модели.
Когда вы создаете пользовательскую модель пользователя, которая расширяет AbstractUser
, вам необходимо определить менеджер для этой модели. Менеджер - это объект, который управляет созданием, обновлением и удалением объектов модели.
objects = CustomUserManager()
- это строка кода, которая определяет менеджер для вашей пользовательской модели пользователя. В этом случае, CustomUserManager
- это класс, который наследуется от BaseUserManager
и переопределяет методы для создания пользователей.
Пример CustomUserManager
# managers.py
from django.contrib.auth.base_user import BaseUserManager
class CustomUserManager(BaseUserManager):
"""
Пользовательский менеджер моделей пользователей,
где электронная почта является уникальным идентификатором
для аутентификации вместо имен пользователей.
"""
def create_user(self, email, password, **extra_fields):
"""
Create and save a User with the given email and password.
"""
if not email:
raise ValueError('The Email must be set')
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save()
return user
def create_superuser(self, email, password, **extra_fields):
"""
Создайте и сохраните имя суперпользователя с указанным
адресом электронной почты и паролем.
"""
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
extra_fields.setdefault('is_active', True)
if extra_fields.get('is_staff') is not True:
raise ValueError('Superuser must have is_staff=True.')
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True.')
return self.create_user(email, password, **extra_fields)
Шаг 3: Обновите myproject/settings.py
После создания новой модели пользователя, вам необходимо настроить ее в Django. Для этого откройте файл settings.py
и добавьте имя вашей новой модели в список AUTH_USER_MODEL
.
# settings.py
INSTALLED_APPS = [
"unfold",
"unfold.contrib.filters", # optional, if special filters are needed
#
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
#
"apps.profiles.apps.ProfilesConfig",
]
AUTH_USER_MODEL = 'profiles.CustomUser'
Шаг 4: Регистрация модели пользователя на сайте администратора
В этом случае, вы можете изменить код, чтобы использовать email в качестве основного идентификатора пользователя вместо username. Вот пример того, как вы можете изменить код:
# admin.py
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import Group
from django.utils.translation import gettext_lazy as _
from unfold.forms import AdminPasswordChangeForm, UserChangeForm, UserCreationForm
from unfold.admin import ModelAdmin
from apps.profiles.models import CustomUser
admin.site.unregister(Group)
@admin.register(Group)
class GroupAdmin(ModelAdmin):
pass
@admin.register(CustomUser)
class CustomUserAdmin(BaseUserAdmin, ModelAdmin):
list_display = ("email", "first_name", "last_name", "is_staff")
search_fields = ("email", "first_name", "last_name")
ordering = ("email",)
fieldsets = (
(None, {"fields": ("email", "password")}),
(_("Personal info"), {"fields": ("first_name", "last_name")}),
(_("Permissions"),
{
"fields": (
"is_active",
"is_staff",
"is_superuser",
"groups",
"user_permissions",
),
},
),
(_("Important dates"), {"fields": ("last_login", "date_joined")}),
)
add_fieldsets = (
(
None,
{
"classes": ("wide",),
"fields": ("email", "usable_password", "password1", "password2"),
},
),
)
form = UserChangeForm
add_form = UserCreationForm
change_password_form = AdminPasswordChangeForm
Шаг 5: Создание миграции и миграция базы данных
python manage.py makemigrations
python manage.py migrate
Шаг 6: Создание пользователя
python manage.py createsuperuser
Заключение
В этом шаге мы рассмотрели, как создать пользовательские модели в Django, которые расширяют AbstractUser
. Мы создали новую модель пользователя, добавили дополнительные поля или изменили существующие, настроили модель пользователя в Django и выполнили миграцию базы данных. Теперь у вас есть возможность использовать свои пользовательские модели вместо стандартных моделей Django.