Сьогодні ми крок за кроком реалізуємо функціонал створення нових користувачів, починаючи з форми, обробника представлення і закінчуючи користувацьким інтерфейсом.
Крок 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.
Тепер у нас є робоча сторінка реєстрації, яка буде основою для подальшої аутентифікаційної системи. Користувачі зможуть створювати акаунти і одразу починати працювати з вашим застосунком.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ