Найти тему

Создание личного кабинета пользователя на сайте под управлением Django

Оглавление

Когда я решаю создать личный кабинет для пользователей на сайте, это довольно увлекательный процесс, особенно когда используешь 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

Уведомления и настройки:

Могу добавить возможность настроек уведомлений и других функций, которые могут понадобиться пользователям.

Этот подход позволяет создать гибкий и функциональный личный кабинет, который можно легко адаптировать под любые нужды.