Как вы уже поняли UserCreationForm() в django.contrib.auth.forms предоставляет ограниченное количество полей.
Предположим, мы хотим отправить письмо с подтверждением пользователя, но мы не можем этого сделать, потому что при регистрации у него нет поля электронной почты.
Для этого либо мы модифицируем форму UserCreationForm, включая поле электронной почты и средство проверки, либо создаем новую форму регистрации пользователя с нуля.
Мы создадим новую форму регистрации пользователя, потому что она обеспечит полный контроль над формой.
Сначала мы создадим файл forms.py и новый класс SignUpForm в файле forms.py приложения accounts:
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
class SignUpForm(UserCreationForm):
username = forms.CharField(max_length=30)
email = forms.EmailField(max_length=200)
class Meta:
model = User
fields = ['username', 'email', 'password1', 'password2']
А в файле views.py мы изменим:
from .forms import SignUpForm
from django.urls import reverse_lazy
from django.views import generic
class SignUpView(generic.CreateView):
form_class = SignUpForm
success_url = reverse_lazy("login")
template_name = "registration/signup.html"
То есть мы просто импортировали из форм новую форму и переопределили наш form_class.
Теперь протестируем, регистрируем новый аккаунт:
Попробуем войти после регистрации:
Попробуем восстановить пароль, переходим по ссылке http://127.0.0.1:8000/accounts/password_reset/ и вводим наш e-mail указанный при регистрации, нажимаем Send me instructions и видим страницу успешной отправки с текстом Check your inbox.
Далее зайдем на почту и проверим наше письмо:
Мы можем перейти по ссылке и изменить наш пароль. Также откроем админ-панель и посмотрим там:
Как вы поняли, у нас все работает, по такому же принципу мы можем добавить еще First Name и Last Name.
И в конце давайте изменим наш базовый шаблон блога и добавим туда необходимую логику, добавим в login.html ниже нашей формы следующий код:
<p><a href="{% url 'password_reset' %}">Reset Password</a></p>
И теперь мы видим новую ссылку на восстановление пароля:
Теперь мы внедрили надежную аутентификацию пользователей для нашего блога с входом в систему, выходом из системы, регистрацией и сбросом пароля.