Доработка формы регистрации
Далее нам нужна форма, которая будет отображаться пользователям, проверять данные и сохранять их в базе данных.
К счастью, нам не нужно изобретать велосипед, потому что в Django есть встроенная простая в использовании форма UserCreationForm. Это форма, которая создает пользователя без каких-либо привилегий с указанным именем пользователя и паролем.
Поэтому мы можем просто расширить встроенную форму модели и добавить дополнительные поля. Я собираюсь добавить адрес электронной почты, имя и фамилию пользователя.
Давайте откроем наш файл forms.py приложения accounts и изменим наш класс SignUpForm, добавив новые поля:
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
class SignUpForm(UserCreationForm):
first_name = forms.CharField(max_length=100)
last_name = forms.CharField(max_length=100)
username = forms.CharField(max_length=100)
email = forms.EmailField()
password1 = forms.CharField(max_length=50, widget=forms.PasswordInput())
password2 = forms.CharField(max_length=50, widget=forms.PasswordInput())
class Meta:
model = User
fields = ['first_name', 'last_name', 'username', 'email', 'password1', 'password2']
В мета-классе мы можем создать связь между полями нашей модели и различными полями, которые мы хотим иметь в нашей форме.
Давайте перейдем к views.py, он у нас остается без изменений. Здесь я буду использовать представление на основе классов для обработки формы регистрации:
from django.urls import reverse_lazy
from django.views import generic
from .forms import SignUpForm
class SignUpView(generic.CreateView):
form_class = SignUpForm
success_url = reverse_lazy("login")
template_name = "registration/signup.html"
По большому счету мы немного изменили нашу форму, добавив поля и сделав их обязательными.
Давайте внесем изменения в наш шаблон формы registration/signup.html, добавим обработку ошибок:
{% extends "blog/base.html" %}
{% block title %} Sign Up {% endblock %}
{% block content %}
<h2> Sign Up </h2>
{% if form.errors %}
<div style="display: table; margin: 0 auto; text-align: left;">
{% for key, value in form.errors.items %}
<strong>{{ value }}</strong>
{% endfor %}
</div>
{% endif %}
<form method="post">
{% csrf_token %}
<p>Username: {{ form.username }}</p>
<p>Email: {{ form.email }}</p>
<p>First Name: {{ form.first_name }}</p>
<p>Last Name: {{ form.last_name }}</p>
<p>Password: {{ form.password1 }}
{{ form.errors.password2 }}</p>
<p>Confirm Password: {{ form.password2 }}</p>
<button type="submit">Sign Up</button>
</form>
<a href="{% url 'login' %}">Have an account? Go to Log In</a>
{% endblock %}
Приведенный фрагмент кода между {% if form.errors %} и {% endif %} сначала проверяет наличие ошибки, затем перебирает ошибки и отображает сообщение об ошибке в предупреждении начальной загрузки:
Продолжим доработки в следующем шаге.