Личный кабинет пользователя в Django: пошаговая инструкция
За полтора-два часа вы соберёте рабочий личный кабинет на Django 5.x: регистрация, вход, страница профиля и смена пароля. Всё на встроенных механизмах, без сторонних пакетов.

К концу этой инструкции у вас будет работающий личный кабинет на Django 5.x: пользователь сможет зарегистрироваться, войти, увидеть свою страницу профиля и сменить пароль. Мы обойдёмся встроенным приложением django.contrib.auth — без DRF, без django-allauth, без сторонних форм. На всё уйдёт полтора-два часа, если Python и Django уже установлены.
Регистрация через соцсети, подтверждение почты и восстановление пароля по e-mail — отдельные темы, здесь их не трогаем. Задача — минимальный кабинет, который дальше можно расширять.
Что нужно иметь до начала
- Python 3.10+ и Django 5.x (
pip install "Django>=5.0,<5.2"). Проверьте версию:python -m django --version. - Созданный проект и хотя бы одно приложение. Если проекта ещё нет — команды ниже создадут его с нуля.
- Применённые миграции для
auth— они входят в стандартный набор Django, отдельная установка не нужна.
Если проект уже есть, пропустите первый шаг и держите в голове имена: проект называется mysite, приложение — accounts. Подставляйте свои.
Шаг 1. Создаём проект и приложение
django-admin startproject mysite
cd mysite
python manage.py startapp accounts
python manage.py migrateЗарегистрируйте приложение в mysite/settings.py в списке INSTALLED_APPS:
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"accounts", # ваше приложение
]Проверка: запустите python manage.py runserver и откройте http://127.0.0.1:8000/ — должна появиться стартовая страница Django с ракетой.
Шаг 2. Подключаем встроенные маршруты входа и выхода
Django поставляется с готовыми view для входа и выхода. Их достаточно подключить в mysite/urls.py:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path("admin/", admin.site.urls),
# Встроенные маршруты: login, logout, password_change и др.
path("accounts/", include("django.contrib.auth.urls")),
path("", include("accounts.urls")), # наши страницы
]Модуль django.contrib.auth.urls даёт готовые пути accounts/login/, accounts/logout/, accounts/password_change/ и другие. Views для них уже написаны, а вот шаблоны придётся создать самим — их Django намеренно не поставляет.
Шаг 3. Настраиваем редиректы и шаблоны
Добавьте в конец settings.py три настройки:
LOGIN_REDIRECT_URL = "profile" # куда вести после входа
LOGOUT_REDIRECT_URL = "login" # куда вести после выхода
LOGIN_URL = "login" # куда отправлять неавторизованныхПроверьте, что в settings.py в секции TEMPLATES в поле DIRS указана папка с шаблонами, либо APP_DIRS стоит True (по умолчанию так и есть). Создайте структуру папок внутри приложения:
accounts/
templates/
registration/
login.html
password_change_form.html
password_change_done.html
accounts/
profile.html
signup.htmlПапка registration — не случайное имя: встроенные view ищут шаблоны именно там (registration/login.html и т. д.). Не переименовывайте её.
Django даёт готовую логику авторизации, но принципиально не навязывает вёрстку. Views есть — HTML пишете вы. Это и есть причина, по которой новичок видит ошибку «TemplateDoesNotExist» на пустом месте.
Шаблон входа
Минимальный registration/login.html:
<h1>Вход</h1>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Войти</button>
</form>
<a href="{% url 'signup' %}">Регистрация</a>Проверка: откройте http://127.0.0.1:8000/accounts/login/ — должна появиться форма с полями «Имя пользователя» и «Пароль».
Шаг 4. Делаем регистрацию
Встроенной страницы регистрации в auth.urls нет — её собирают из готовой формы UserCreationForm. В accounts/views.py:
from django.contrib.auth import login
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.decorators import login_required
from django.shortcuts import render, redirect
def signup(request):
if request.method == "POST":
form = UserCreationForm(request.POST)
if form.is_valid():
user = form.save()
login(request, user) # сразу логиним нового пользователя
return redirect("profile")
else:
form = UserCreationForm()
return render(request, "accounts/signup.html", {"form": form})
@login_required
def profile(request):
return render(request, "accounts/profile.html")Декоратор @login_required закрывает страницу профиля от анонимов: неавторизованного он отправит на LOGIN_URL.
Создайте accounts/urls.py:
from django.urls import path
from . import views
urlpatterns = [
path("signup/", views.signup, name="signup"),
path("profile/", views.profile, name="profile"),
]Шаблон accounts/signup.html — та же схема, что и у входа:
<h1>Регистрация</h1>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Зарегистрироваться</button>
</form>Проверка: зайдите на /signup/, создайте пользователя. После отправки формы вас должно перекинуть на /profile/.
Шаг 5. Страница профиля и смена пароля
Шаблон accounts/profile.html показывает данные текущего пользователя из объекта request.user:
<h1>Личный кабинет</h1>
<p>Логин: {{ user.username }}</p>
<p>Email: {{ user.email|default:"не указан" }}</p>
<a href="{% url 'password_change' %}">Сменить пароль</a>
<form method="post" action="{% url 'logout' %}">
{% csrf_token %}
<button type="submit">Выйти</button>
</form>Обратите внимание: выход в Django 5.x работает только через POST. Ссылка <a href="/accounts/logout/"> вернёт ошибку 405. Поэтому кнопка выхода оформлена как форма.
Смена пароля уже подключена через auth.urls. Нужны только два шаблона. registration/password_change_form.html:
<h1>Смена пароля</h1>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Сохранить</button>
</form>И registration/password_change_done.html:
<h1>Пароль изменён</h1>
<a href="{% url 'profile' %}">Вернуться в кабинет</a>Проверка: войдите, откройте /profile/, нажмите «Сменить пароль», введите старый и новый — должна появиться страница «Пароль изменён». Кнопка «Выйти» возвращает на страницу входа.
Что за какой URL отвечает
| URL | Имя | Откуда view |
|---|---|---|
| /accounts/login/ | login | auth.urls (встроенный) |
| /accounts/logout/ | logout | auth.urls, только POST |
| /accounts/password_change/ | password_change | auth.urls (встроенный) |
| /signup/ | signup | ваш views.py |
| /profile/ | profile | ваш views.py |
Если не получилось
- TemplateDoesNotExist: registration/login.html — шаблон лежит не в той папке. Проверьте путь
accounts/templates/registration/login.htmlи чтоaccountsесть вINSTALLED_APPS. - NoReverseMatch: Reverse for 'profile' not found — не подключён
accounts.urlsв корневомurls.pyлибо вpathопечатка вname. - 405 Method Not Allowed при выходе — вы вызываете logout ссылкой. В Django 5.x нужен POST-запрос через форму, как в шаблоне профиля.
- После входа перекидывает на /accounts/profile/ и там 404 —
LOGIN_REDIRECT_URLждёт имя маршрутаprofile, а Django по умолчанию редиректит на/accounts/profile/. Задайте настройку явно:LOGIN_REDIRECT_URL = "profile". - Форма регистрации ругается на пароль — сработали валидаторы из
AUTH_PASSWORD_VALIDATORS. Это не баг: пароль вроде12345Django отклоняет намеренно.
Что делать дальше
Кабинет работает, но пока держится на минимуме. Дальше по порядку:
- Расширьте профиль. Встроенная модель
Userхранит только логин, имя, почту. Для аватара, телефона и прочего заведите модельProfileсOneToOneField(User)либо кастомную модель пользователя — но её выбирают до первой миграции, менять на живом проекте больно. - Добавьте восстановление пароля по e-mail — в
auth.urlsдля этого уже есть маршрутыpassword_reset, нужен только настроенныйEMAIL_BACKEND. - Оберните шаблоны в базовый
base.htmlчерез{% extends %}, чтобы не дублировать вёрстку.
Перед выкладкой в прод проверьте, что DEBUG = False, задан ALLOWED_HOSTS и сайт работает по HTTPS — иначе сессионная кука с авторизацией уходит открытым текстом.
Саммаризатор: 50 страниц или созвон — в 5 главных тезисов.
Спросить за 15 ₽Источники: Django 5.x — Using the Django authentication system, Django 5.x — Authentication Views
Частые вопросы
У меня Django 4.2, а не 5.x — инструкция подойдёт?
Нужно ли ставить django-allauth или DRF для личного кабинета?
Почему форма регистрации не принимает мой пароль?
Как сделать, чтобы на профиле были поля кроме логина и почты?
После входа выдаёт 404 на /accounts/profile/ — что не так?
Безопасно ли хранить пароли так, как в этой инструкции?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.