Итоги работы
Что мы построили
За первую часть проекта «Сайт статей» у нас появился полноценный многопользовательский сайт:
| Этап | Что сделали |
|---|---|
| Структура | Проект backend, приложения в папке modules/, общий код в modules/services/ |
| Модели | Article с менеджером custom, статусом, закреплением, автором и редактором |
| Категории | Дерево на MPTTModel, меню через recursetree |
| Представления | ListView, DetailView, CreateView, UpdateView, DeleteView |
| Слаги | unique_slugify с транслитерацией кириллицы (unidecode) |
| Оптимизация | select_related, Debug Toolbar, assertNumQueries |
| Профили | Profile + сигнал post_save, страница и редактирование профиля |
| Права | LoginRequiredMixin, свой AuthorRequiredMixin, UserIsNotAuthenticated |
| Авторизация | Регистрация с подтверждением email, вход по email, сброс пароля |
Ключевые идеи
CBV — это конструктор из миксинов. Мы почти не писали обработку GET/POST руками: переопределяли точечные методы — get_queryset(), get_context_data(), form_valid(), get_object(), get_success_url().
Права проверяются на сервере. Шаблон лишь прячет кнопки; защищает миксин в dispatch().
Сигналы — для слабосвязанных реакций. Профиль создаётся при любом способе регистрации, но основную логику держим явной.
Сначала измеряй, потом оптимизируй. Debug Toolbar показывает N+1, select_related его убирает, тест фиксирует результат.
Чек-лист перед второй частью
Проверьте, что у вас работает:
- главная со списком статей, пагинацией и деревом категорий;
- страница категории со статьями всех вложенных подкатегорий;
- детальная страница статьи по кириллическому заголовку → латинский слаг;
- регистрация → письмо в консоли → активация по ссылке → вход;
- добавление статьи, редактирование только своей, удаление с подтверждением;
- страница профиля и редактирование профиля с аватаром.
Во второй части добавим древовидные комментарии на AJAX, теги, капчу, визуальный редактор, лайки, RSS, кеширование, статус «онлайн» и свои страницы ошибок.
Практика решено 0 из 5
Расположите этапы добавления статьи пользователем в порядке выполнения в CreateView (POST):
-
form.is_valid() -
Форма создаётся с
request.POSTиrequest.FILES -
Редирект на
get_absolute_url()статьи -
LoginRequiredMixin.dispatch()проверяет вход -
form_valid():form.instance.author = request.user, сохранение
Какой инструмент выбрать для дерева категорий с вложенностью любой глубины?
Что защищает чужую статью от редактирования?
Каким методом queryset подгрузить автора и категорию статьи одним SQL-запросом (JOIN)? Только имя метода.
Соберите маршруты статей в правильном порядке: home (""), articles_create ("articles/create/"),
articles_update ("articles/articles_detail ("articles/
urlpatterns = [
path("", ArticleListView.as_view(), name="home"),
path("articles/create/", ArticleCreateView.as_view(), name="articles_create"),
path("articles/<str:slug>/update/", ArticleUpdateView.as_view(), name="articles_update"),
path("articles/<str:slug>/", ArticleDetailView.as_view(), name="articles_detail"),
]
Войдите, чтобы отмечать пройденные уроки.