Настройка окружения
Создадим проект средствами PyCharm Professional Edition. В нём используется версия Django 4.2, интерпретатор Python 3.11.2. Все необходимые папки и файлы уже созданы.
В соответствии с заданием требуется использовать СУБД PostgreSQL 16. Для этого изменим переменную DATABASES
в файле
settings.py
:
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql",
"NAME": "race_table",
"USER": "dptgo",
"PASSWORD": "iloveweb",
"HOST": "localhost",
"PORT": "5001",
}
}
Не забудем удостовериться, что у нас существует соответствующая база данных и пользователь с правами на неё:
Сущности базы данных
Для реализации задания нам потребуются следующие сущности:
User
: информация о пользователе;Team
: информация о команде;Racer
: информация о гонщике;Race
: информация о гонке;RaceEntry
: регистрация участников на гонку;Comment
: комментарии и отзывы.
Более подробная информация и реализация представлены в файле models.py
и на соответствующей странице отчёта.
Зарегистрируем эти сущности в файле admin.py
:
from django.contrib import admin
from .models import Team, Racer, Race, RaceEntry, Comment
admin.site.register(Team)
admin.site.register(Racer)
admin.site.register(Race)
admin.site.register(RaceEntry)
admin.site.register(Comment)
С помощью команды python3 manage.py makemigrations
создадим миграции для базы данных и сделаем миграцию с помощью
python3 manage.py migrate
. Для этого потребуется предварительно установить библиотеку psycopg2
или psycopg2-binary
(в контексте создания сайта на Django они предоставляют возможность создания миграций для PostgreSQL), если она ещё не
установлена.
Регистрация и авторизация
Для регистрации прежде всего необходимо создать формы. Для этого создадим файл forms.py
и сделаем две формы: одну
для регистрации пользователя, другую для регистрации гонщика. Для создания пользователя будем использовать уже
встроенный класс User
, который предоставляет необходимый функционал (никнейм, пароль, почта, встроенная система
авторизации). Код форм представлен на соответствующей странице отчёта.
Далее создадим файл views.py
и реализуем в нём функции для регистрации. Также реализуем две HTML-страницы, которые по
нашим представлениям и формам будет собирать страницу регистрации для обычного пользователя и гонщика. Код
представлен на соответствующей странице отчёта.
Аналогичные действия сделаем для страницы авторизации. Стоит заметить, что Django предоставляет готовое
представление для страницы входа, поэтому здесь достаточно создать HTML-страницу и добавить ссылку на неё в urls.py
.
Объединим доступ к созданным страницам с помощью навигации на главной странице.
После авторизации будем переводить пользователя сразу на таблицу с гонками. Для этого добавим в файл settings.py
следующую строчку:
Таблица гонок
Таблица содержит следующие столбцы: номер гонки (ID), название, дата проведения, победитель, команда победителя,
оставить комментарий. Поскольку вся требуемая информация о каждой гонке содержится в базе данных, достаточно
получить все эти объекты с помощью Race.objects.all()
и передать их в шаблон. Код представления и шаблона
представлен на соответствующих страницах отчёта.
Функционал для внесения гонок на стороне клиента не предоставляется — этим занимается администратор сайта через
админ-панель (в нашем случае — admin
, которого мы создали командой python3 manage.py createsuperuser
).
Комментарии к гонкам
Страница с комментарием имеет следующую структуру: вверху — поле для ввода, внизу — все оставленные комментарии под
гонкой. Для реализации поля ввода создадим форму и представление (поскольку пользователь уже вошёл — это проверяется
декоратором @login_required
— достаточно показать ему только поле с выбором типа комментария и текстом).
Также заметим, что в данном случае необходимо использовать ссылку вида races/<int:race_id>/comments/
, чтобы
страницы с комментариями были уникальны для каждой гонки.
Управление профилем
По заданию необходимо реализовать редактирование и удаление информации профиля. Отдельно создадим возможность редактирования информации для пользователя и гонщика (поскольку второй имеет дополнительные поля). Представление же будет одно на всех, но с обработкой случая, когда авторизовался гонщик.
Также создадим представление для удаления и страницу, подтверждающую это действие. После удаления профиля он
удаляется из базы данных (request.user.delete()
), происходит перенаправление на главную страницу.
Переход на данную страницу осуществляется со страницы с таблицей гонок, и обратно — со страницы управления профилем.
Завершение работы
По завершении работы необходимо добавить все маршруты в файл urls.py
и проверить работоспособность сайта. Содержимое
файла:
from django.contrib.auth import views as auth_views
from django.contrib import admin
from django.urls import path
from race_table_app import views
urlpatterns = [
path("admin/", admin.site.urls),
path("", views.home, name="home"),
path("register/", views.register, name="register"),
path("register_racer/", views.register_racer, name="register_racer"),
path(
"login/", auth_views.LoginView.as_view(template_name="login.html"), name="login"
),
path("races/", views.races_list, name="races_list"),
path("races/<int:race_id>/comments/", views.race_comments, name="race_comments"),
path("profile/", views.profile, name="profile"),
path("profile/delete/", views.delete_profile, name="delete_profile"),
]
Работа над сайтом завершена. Пример его работоспособности представлен на соответствующей странице отчёта.