Когда я решаю создать личный кабинет для пользователей на сайте, это довольно увлекательный процесс, особенно когда используешь Django. Вот пошаговое руководство по созданию такого функционала.
Шаг 1: Настройка модели пользователя
В Django по умолчанию есть встроенная модель пользователя, но иногда бывает нужно добавить дополнительные поля. В этом случае я создаю кастомную модель пользователя.
Создаю кастомную модель пользователя в models.py приложения accounts:
from django.contrib.auth.models import AbstractUser
from django.db import models
class CustomUser(AbstractUser):
bio = models.TextField(max_length=500, blank=True)
location = models.CharField(max_length=30, blank=True)
birth_date = models.DateField(null=True, blank=True)
Настраиваю Django использовать кастомную модель в settings.py:
AUTH_USER_MODEL = 'accounts.CustomUser'
Создаю и применяю миграции для новой модели:
python manage.py makemigrations
python manage.py migrate
Шаг 2: Регистрация и аутентификация
Для регистрации и аутентификации пользователей я использую встроенные возможности Django и добавляю немного своего кода.
Создаю форму регистрации в forms.py:
from django import forms
from django.contrib.auth.forms import UserCreationForm
from .models import CustomUser
class CustomUserCreationForm(UserCreationForm):
class Meta:
model = CustomUser
fields = ('username', 'email', 'bio', 'location', 'birth_date')
Создаю представление для регистрации в views.py:
from django.shortcuts import render, redirect
from django.contrib.auth import login
from .forms import CustomUserCreationForm
def register(request):
if request.method == 'POST':
form = CustomUserCreationForm(request.POST)
if form.is_valid():
user = form.save()
login(request, user)
return redirect('dashboard')
else:
form = CustomUserCreationForm()
return render(request, 'accounts/register.html', {'form': form})
Добавляю URL для регистрации в urls.py приложения accounts:
from django.urls import path
from . import views
urlpatterns = [
path('register/', views.register, name='register'),
]
Создаю шаблон для регистрации в папке templates/accounts/register.html:
<h2>Регистрация</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Зарегистрироваться</button>
</form>
Вход и выход
Django уже предоставляет представления для входа и выхода, что делает их настройку довольно простой.
Добавляю URL для входа и выхода в urls.py:
from django.contrib.auth import views as auth_views
urlpatterns = [
path('login/', auth_views.LoginView.as_view(), name='login'),
path('logout/', auth_views.LogoutView.as_view(), name='logout'),
]
Создаю шаблон для входа в папке templates/registration/login.html:
<h2>Вход</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Войти</button>
</form>
Шаг 3: Личный кабинет
Теперь я настраиваю страницу личного кабинета, доступную только для аутентифицированных пользователей.
Создаю представление для личного кабинета в views.py:
from django.contrib.auth.decorators import login_required
@login_required
def dashboard(request):
return render(request, 'accounts/dashboard.html')
Добавляю URL для личного кабинета в urls.py:
urlpatterns += [
path('dashboard/', views.dashboard, name='dashboard'),
]
Создаю шаблон для личного кабинета в папке templates/accounts/dashboard.html:
<h2>Личный кабинет</h2>
<p>Привет, {{ user.username }}!</p>
<p>Ваш email: {{ user.email }}</p>
<p>Ваше местоположение: {{ user.location }}</p>
<p>Дата рождения: {{ user.birth_date }}</p>
Шаг 4: Дополнительные возможности
Для того чтобы личный кабинет был более функциональным, я часто добавляю следующие возможности:
Редактирование профиля:
Создаю форму редактирования профиля в forms.py:
from django import forms
from .models import CustomUser
class CustomUserChangeForm(forms.ModelForm):
class Meta:
model = CustomUser
fields = ('username', 'email', 'bio', 'location', 'birth_date')
Создаю представление для редактирования профиля в views.py:
from django.shortcuts import get_object_or_404
from django.contrib.auth.decorators import login_required
from django.contrib.auth import update_session_auth_hash
from .forms import CustomUserChangeForm
@login_required
def edit_profile(request):
if request.method == 'POST':
form = CustomUserChangeForm(request.POST, instance=request.user)
if form.is_valid():
form.save()
return redirect('dashboard')
else:
form = CustomUserChangeForm(instance=request.user)
return render(request, 'accounts/edit_profile.html', {'form': form})
Добавляю URL для редактирования профиля в urls.py:
urlpatterns += [
path('edit-profile/', views.edit_profile, name='edit_profile'),
]
Создаю шаблон для редактирования профиля в папке templates/accounts/edit_profile.html:
<h2>Редактировать профиль</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Сохранить</button>
</form>
Смена пароля:
Использую встроенные представления Django для смены пароля. Добавляю URL для смены пароля в urls.py:
urlpatterns += [
path('password_change/', auth_views.PasswordChangeView.as_view(), name='password_change'),
path('password_change/done/', auth_views.PasswordChangeDoneView.as_view(), name='password_change_done'),
]
Создаю шаблоны для смены пароля в папке templates/registration:
- password_change_form.html
- password_change_done.html
Уведомления и настройки:
Могу добавить возможность настроек уведомлений и других функций, которые могут понадобиться пользователям.
Этот подход позволяет создать гибкий и функциональный личный кабинет, который можно легко адаптировать под любые нужды.