Сегодня мы шаг за шагом реализуем функциональность создания новых пользователей, начиная с формы, обработчика представления и заканчивая пользовательским интерфейсом.
Шаг 1: Создание формы регистрации
Для начала создадим форму, которая соберёт данные от пользователя. Мы можем создать форму с нуля (используя класс forms.Form) или на основе модели User (с помощью ModelForm). Для упрощения начнём с базового подхода.
Форма на основе forms.Form. Создаём новую форму RegistrationForm, добавляя необходимые поля.
# myapp/forms.py
from django import forms
from django.contrib.auth.models import User
from django.core.exceptions import ValidationError
class RegistrationForm(forms.Form):
username = forms.CharField(max_length=150, required=True, label="Имя пользователя")
email = forms.EmailField(required=True, label="Электронная почта")
password1 = forms.CharField(
label="Пароль",
widget=forms.PasswordInput,
required=True
)
password2 = forms.CharField(
label="Повторите пароль",
widget=forms.PasswordInput,
required=True
)
def clean_username(self):
"""Проверяем, что имя пользователя уникально."""
username = self.cleaned_data['username']
if User.objects.filter(username=username).exists():
raise ValidationError("Пользователь с таким именем уже существует.")
return username
def clean(self):
"""Проверяем, что оба пароля совпадают."""
cleaned_data = super().clean()
password1 = cleaned_data.get("password1")
password2 = cleaned_data.get("password2")
if password1 and password2 and password1 != password2:
raise ValidationError("Пароли не совпадают.")
return cleaned_data
Здесь мы добавили проверку на уникальность имени пользователя и совпадение паролей. Это базовый уровень валидации.
Шаг 2: создание представления для регистрации
Теперь займёмся представлением, которое будет отвечать за регистрацию. Это будет функция-представление (FBV), чтобы на первых этапах кода было легче работать.
# myapp/views.py
from django.shortcuts import render, redirect
from django.contrib.auth.models import User
from django.contrib.auth import login
from .forms import RegistrationForm
def register(request):
if request.method == "POST":
form = RegistrationForm(request.POST)
if form.is_valid():
# Создаём нового пользователя
user = User.objects.create_user(
username=form.cleaned_data['username'],
email=form.cleaned_data['email'],
password=form.cleaned_data['password1']
)
# Автоматически логиним нового пользователя
login(request, user)
# Редирект на главную страницу
return redirect('home') # Убедитесь, что у вас есть URL с именем 'home'
else:
form = RegistrationForm()
return render(request, 'registration/register.html', {'form': form})
Здесь мы выполняем следующие действия:
- Проверяем, является ли запрос POST.
- Валидируем форму.
- Если всё хорошо, создаём пользователя через метод
create_user. - Логиним пользователя после регистрации.
- Перенаправляем его на главную страницу.
Шаг 3: разработка шаблона страницы регистрации
Шаблон — это то, как страница будет выглядеть для пользователя. Создадим файл register.html в папке templates/registration/.
<!-- templates/registration/register.html -->
{% extends 'base.html' %}
{% block content %}
<h2>Регистрация</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Зарегистрироваться</button>
</form>
{% endblock %}
Мы делаем простой HTML-шаблон, который включает форму и кнопку отправки.
Шаг 4: настройка и подключение маршрута
Добавим URL для нашего представления в urls.py.
# myapp/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('register/', views.register, name='register'),
# другие маршруты
]
Теперь наш маршрут готов, и пользователи могут зайти на /register/, чтобы зарегистрироваться.
Шаг 5: улучшение пользовательского опыта (UX)
Когда разработка базовой функциональности завершена, важно подумать о пользовательском опыте:
- Обработка сообщений об успехе и ошибках. Добавим сообщения, чтобы сообщить пользователю,
- что регистрация прошла успешно. Мы будем использовать Django Message Framework.
Обновим наше представление следующим образом:
from django.contrib import messages
def register(request):
if request.method == "POST":
form = RegistrationForm(request.POST)
if form.is_valid():
user = User.objects.create_user(
username=form.cleaned_data['username'],
email=form.cleaned_data['email'],
password=form.cleaned_data['password1']
)
login(request, user)
messages.success(request, "Вы успешно зарегистрировались!")
return redirect('home')
else:
form = RegistrationForm()
return render(request, 'registration/register.html', {'form': form})
А в шаблон добавим обработку сообщений:
{% if messages %}
<ul>
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
Стилизация формы. Подключите CSS-библиотеку, например, Bootstrap, чтобы сделать форму более привлекательной:
<form method="post" class="form-group">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="btn btn-primary">Зарегистрироваться</button>
</form>
Шаг 6: добавление e-mail подтверждения
Предположим, что мы хотим, чтобы пользователь подтверждал свою регистрацию через e-mail. Для этого:
- Генерируем токен для пользователя.
- Отправляем e-mail с ссылкой на активацию.
- После перехода по ссылке активируем учётную запись.
Этот процесс требует настройки отправки писем в Django. На этом этапе курса мы оставим эту задачу как опциональную, но впереди мы ещё будем детально разбирать работу с e-mail.
Практическое задание
- Реализуйте базовую функциональность регистрации в вашем проекте.
- Добавьте сообщения об успешной регистрации.
- Попробуйте настроить кастомную валидацию для e-mail (например, запретить регистрацию с почтовыми адресами от определённого домена).
- Стилизуйте форму регистрации с использованием Bootstrap.
Теперь у нас есть рабочая страница регистрации, которая будет основой для последующей аутентификационной системы. Пользователи смогут создавать аккаунты и сразу начинать работать с вашим приложением.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ