Использование 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.

💡
Мы используете тему django-unfold для админ-панели Django. Это тема, которая предоставляет более современный и интуитивно понятный интерфейс для админ-панели Django.
# 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.

Read more

Замена дефолтного перевода слова в Django Admin

Если вы не удовлетворены тем, как приложение перевело какое-нибудь слово, вы можете легко заменить его на свой вариант. В этой статье мы рассмотрим, как сделать это в Django. Как Django ищет переводы Когда Django ищет перевод слова, он сначала проверяет папку locale на самом верхнем уровне проекта. Если перевод не

By Dmitry

Показ кастомной страницы 404 в Django

В этом посте мы рассмотрим, как показать кастомную страницу 404 в приложении на Django. Это может быть полезно, если вы хотите предоставить пользователям более информативную и дружелюбную страницу ошибки вместо стандартной страницы 404, которая показывает только сообщение об ошибке. Шаг 1: Создание кастомной страницы 404 Сначала создайте новый шаблон для

By Dmitry

Вход по SSH на удаленный сервер Ubuntu без пароля

Настройка входа по SSH на сервере Ubuntu В этой статье мы рассмотрим, как настроить вход пользователей только по SSH на сервере Ubuntu. Это позволит повысить безопасность вашего сервера, ограничив вход только по защищённому протоколу SSH. Шаг 1: Установка и настройка OpenSSH OpenSSH - это пакет, который позволяет устанавливать защищённое соединение

By Dmitry

Автоматизация деплоя по SSH с паролем

Автоматизация деплоя с помощью GitHub Actions и SSH для Django проекта (вход на сервер по SSH с паролем) GitHub Actions — это сервис, который позволяет автоматизировать процесс сборки, тестирования и деплоя вашего кода. Одним из способов деплоя является использование SSH для подключения к серверу и копирования файлов. В этой статье мы

By Dmitry