Продвинутый Django 5 для продолжающих

Прогресс по курсу:  0/193

8.3 Создание кастомной User модели
4 из 5 шагов пройдено
0 из 5 баллов  получено

Создание суперпользователя

Создайте суперпользователя, выполнив следующую команду:

python manage.py createsuperuser


Вам должно быть предложено ввести адрес электронной почты и пароль:


Как вы можете видеть выше, уникальным идентификатором является адрес электронной почты вместо имени пользователя по умолчанию, предоставленного Django. И если мы откроем наши записи в БД, мы увидим следующую строку в таблице пользователей:

 

Создание пользовательской формы

Следующим шагом является преобразование пользовательской модели в форму Django.

Django предоставляет класс ModelForm, который используется для прямого преобразования модели в форму Django. Создайте файл forms.py и добавьте следующий код:

from django import forms
from django.core.exceptions import ValidationError

from .models import User


class UserCreationForm(forms.ModelForm):
    password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
    password2 = forms.CharField(label='Enter Password Again', widget=forms.PasswordInput)

    class Meta:
        model = User
        fields = ('email', 'phone_number')

    def clean_password2(self):
        # Убедимся, что две записи пароля совпадают

        password1 = self.cleaned_data.get("password1")
        password2 = self.cleaned_data.get("password2")
        if password1 and password2 and password1 != password2:
            raise ValidationError("Passwords don't match")
        return password2

    def save(self, commit=True):
        # Сохраним предоставленный пароль в хэшированном формате
        user = super().save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        if commit:
            user.save()
        return user

Здесь мы сначала начинаем с создания формы создания пользователя, проверяем, совпадают ли пароли, и хешируем предоставленный пароль.
 

Регистрация формы в Django Admin

Откройте admin.py и добавьте код:

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .forms import UserCreationForm
from .models import User


class CustomUserAdmin(UserAdmin):
    add_form = UserCreationForm

    list_display = ('email', 'phone_number', 'is_admin')
    list_filter = ('is_admin',)
    fieldsets = (
        (None, {'fields': ('email', 'password')}),
        ('Permissions', {'fields': ('is_admin',)}),
    )
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('email', 'password1', 'password2', 'phone_number'),
        }),
    )
    ordering = ('email',)
    filter_horizontal = ()


admin.site.register(User, CustomUserAdmin)

 

  • list_display - определяет поля, используемые для создания нового пользователя
  • list_filter - определяет критерии фильтрации


Запустите сервер разработки:

python manage.py runserver


Перейдите на сайт администратора (http://127.0.0.1:8000/admin/), мы видим, что Django у нас требует Email и пароль:


Войдите в систему с учетными данными суперпользователя и в следующем шаге попробуем приступить к добавлению новых пользователей. Попробуем создать нового пользователя, мы видим те поля, которые добавили для нашего пользователя:

Нажав SAVE мы успешно создадим пользователя.


Попробуем создать пользователя с не правильным форматом телефонного номера, чтобы проверить работу нашего валидатора:

Как мы видим все прекрасно работает.


В этом проекте мы не будем создавать страницы регистрации, профиля и другие пользовательские страницы. Данные возможности мы рассмотрели в предыдущем курсе при добавлении стандартной пользовательской системы в Django


  • Комментария
Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий

Помогите разобраться с авторизацией, при авторизации по email учитывается регистр почты, хотелось бы от этого избавиться
1. Создал модель юзера  и менеджер по примеру из раздала

2. Создал формы регистрации и авторизации, форму авторизации унаследовал от AuthenticationForm

3. Создал view авторизации  унаследовал от LoginView

Какой метод нужно переписать, чтобы регистр почты не учитывался при авторизации

@Михаил, добавьте в формы регистрации и авторизации:

    def clean_email(self):
        data = self.cleaned_data['email']
        return data.lower()

@Дмитрий_Селезнев, спасибо помогло, только в форме логина пришлось использовать clean_username

Тут проблема с валидатором?

Это что-то другое, можете подробнее рассказать при каких условиях она возникает?

@Илья_Перминов, Когда я пытаюсь создать нового пользователя в админ панели

@Nurzhan_Saktaganov, отправьте архив проекта на почту perminoff-ilya@yandex.ru , попытаемся выяснить причину.

@Nurzhan_Saktaganov, отправляли ли свой проект? Он мне не пришёл на почту.

@Nurzhan_Saktaganov, нужно экранировать + в регулярном выражении.
^((\+7)|8)\d{10}$

@Илья_Перминов, Все исправил, спасибо!