- Dockerfile: python:3.12-slim, migrate + collectstatic + gunicorn (0.0.0.0:8000) - docker-compose.yml: порт 8000, env из .env, volume для SQLite - .dockerignore: .env, db.sqlite3, staticfiles, кэш - requirements.txt: + gunicorn - settings.py: STATIC_ROOT для collectstatic - проверено: manage.py check без ошибок
ИО · physics & math
Персональный сайт преподавателя физики и математики
Подготовка к ОГЭ и ЕГЭ, индивидуальные консультации и удобная онлайн-запись.
О проекте
Сайт Игоря Олеговича Безрукавова — преподавателя физики и математики, выпускника АГУ с опытом преподавания и репетиторства более 10 лет.
Главная задача проекта — превратить первый интерес ученика в понятный путь к консультации: показать подход преподавателя, помочь выбрать свободное время и сохранить заявку в рабочем кабинете.
Возможности
| Для ученика | Для преподавателя |
|---|---|
| Адаптивный лендинг с личной подачей | Дашборд с ключевыми показателями |
| Раздельные направления: физика и математика | Управление свободными окнами |
| ОГЭ, ЕГЭ и школьная программа | Статусы заявок от «Новая» до «Проведена» |
| Выбор класса, формата и свободного времени | Быстрые массовые действия |
| Защита от двойной записи на один слот | Ссылка на онлайн-встречу и заметки |
| Политика конфиденциальности и согласие | Фильтры, поиск и история изменений |
Как работает запись
Преподаватель открывает время в админке
↓
Свободный слот появляется на сайте
↓
Ученик заполняет форму и выбирает слот
↓
Заявка появляется в кабинете преподавателя
↓
Подтверждение → консультация → статус «Проведена»
Технологии
- Backend: Django 5, Python
- Database: SQLite для разработки
- Frontend: Django Templates, HTML, CSS
- Admin: кастомизированная Django Admin с дашбордом
- Static: локальные CSS и изображения
- Timezone:
Europe/Astrakhan
Быстрый запуск
1. Установка зависимостей
В терминале PyCharm, находясь в корне проекта:
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
2. Настройка окружения
Скопируйте .env.example в .env и заполните:
Copy-Item .env.example .env
Обязательные переменные (без них приложение не стартует):
| Переменная | Описание |
|---|---|
DJANGO_SECRET_KEY |
Секретный ключ Django. Сгенерировать: python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())" |
DJANGO_DEBUG |
1 для разработки, пусто/0 для продакшена |
DJANGO_ALLOWED_HOSTS |
Разрешённые хосты через запятую (в проде — домен) |
.env в git не попадает (уже в .gitignore).
3. Подготовка базы
.\.venv\Scripts\python.exe manage.py migrate
.\.venv\Scripts\python.exe manage.py createsuperuser
migrate создаст таблицы проекта и django-axes (защита от брутфорса).
4. Запуск
.\.venv\Scripts\python.exe manage.py runserver
После запуска:
| Адрес | Назначение |
|---|---|
http://127.0.0.1:8000/ |
Публичный сайт |
http://127.0.0.1:8000/admin/ |
Кабинет преподавателя |
http://127.0.0.1:8000/privacy/ |
Политика конфиденциальности |
Ежедневная работа преподавателя
- Откройте раздел «Расписание» в админ-панели.
- Добавьте свободное окно: дату, время, длительность, предмет и формат.
- Убедитесь, что у слота включён флаг «Открыт для записи».
- Новая заявка появится в разделе «Записи на консультации».
- Проверьте контакты, подтвердите заявку и при необходимости добавьте ссылку на встречу.
- После занятия переведите заявку в статус «Проведена».
Отменённый слот снова становится доступным для записи. Копировать регулярное расписание можно массовым действием «Создать копии на следующую неделю».
Важно: сайт показывает только заранее созданные свободные окна. Если в расписании нет слотов, на главной странице будет отображаться
0свободных мест.
Статусы заявок
| Статус | Когда использовать |
|---|---|
| Новая | Заявка пришла с сайта и ещё не обработана |
| Подтверждена | Время согласовано с учеником |
| Проведена | Консультация состоялась |
| Отменена | Занятие отменено, слот можно использовать снова |
| Не пришёл | Ученик не подключился или не пришёл |
Структура проекта
teacher_site/
├── config/ # настройки и маршруты Django
├── consultations/ # основное приложение
│ ├── migrations/ # миграции базы данных
│ ├── templates/
│ │ ├── admin/ # дашборд и тема админ-панели
│ │ └── consultations/ # публичные страницы
│ ├── admin.py # расписание, заявки и действия
│ ├── forms.py # форма записи и валидация
│ ├── models.py # слоты и записи
│ └── views.py # публичные страницы
├── static/
│ ├── admin/css/ # оформление кабинета
│ ├── css/ # оформление сайта
│ └── images/ # фотография преподавателя
├── manage.py
├── requirements.txt
└── README.md
Проверка проекта
.\.venv\Scripts\python.exe manage.py check
.\.venv\Scripts\python.exe manage.py makemigrations --check --dry-run
Обе команды должны завершиться без ошибок и сообщений о новых миграциях.
Перед публикацией
В config/settings.py обязательно:
- заменить
SECRET_KEYна секретное значение; - установить
DEBUG = False; - указать домен в
ALLOWED_HOSTS; - настроить
STATIC_ROOTи выполнитьcollectstatic; - заменить SQLite на PostgreSQL, если проектом будут пользоваться постоянно;
- настроить резервное копирование базы и защиту админ-панели.
Для автоматических уведомлений в Telegram или по email понадобятся отдельные токены и данные для подключения. Сейчас заявки надёжно сохраняются в админ-панели, а поле напоминания позволяет отмечать обработку вручную.
Идеи для следующего этапа
- Telegram-уведомление о новой заявке;
- автоматическое подтверждение и напоминание о занятии;
- интеграция с календарём преподавателя;
- онлайн-оплата консультаций;
- личный кабинет ученика;
- публикация отзывов и полезных материалов.
Сделано для спокойной и понятной подготовки к экзаменам.