Skip to content

Настройка окружения

Создадим проект средствами 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 следующую строчку:

LOGIN_REDIRECT_URL = "/races/"

Таблица гонок

Таблица содержит следующие столбцы: номер гонки (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"),
]

Работа над сайтом завершена. Пример его работоспособности представлен на соответствующей странице отчёта.