Итоги работы
Что добавили во второй части
| Возможность | Ключевые инструменты |
|---|---|
| SEO-адреса | маршрут год/месяц/день/слаг, unique_for_date, get_absolute_url |
| Пагинация | Paginator, get_page, фрагмент pagination.html |
| Представления-классы | View, TemplateView, ListView, page_obj |
| Поделиться по email | forms.Form, send_mail, build_absolute_uri, SMTP |
| Комментарии | модель Comment, ModelForm, save(commit=False), @require_POST |
| Теги | django-taggit, TaggableManager, фильтр по тегу |
| Похожие посты | values_list, annotate(Count), сортировка |
| Свои теги и фильтры | simple_tag, inclusion_tag, @register.filter, Markdown |
| Карта сайта и RSS | sitemaps, sites, Feed |
| PostgreSQL | psycopg, dumpdata/loaddata |
| Поиск | SearchVector, SearchQuery, SearchRank, TrigramSimilarity |
Структура проекта
mysite/
├── settings.py sites, sitemaps, postgres, taggit, EMAIL_*, DATABASES
└── urls.py blog/, sitemap.xml, admin/
blog/
├── models.py Post (+ PublishedManager, tags), Comment
├── admin.py PostAdmin, CommentAdmin
├── forms.py EmailPostForm, CommentForm, SearchForm
├── views.py post_list, post_detail, post_share, post_comment, post_search
├── urls.py app_name = "blog"
├── feeds.py LatestPostsFeed
├── sitemaps.py PostSitemap
├── templatetags/
│ └── blog_tags.py total_posts, show_latest_posts, get_most_commented_posts, markdown
└── templates/blog/
├── base.html
└── post/ list, detail, share, comment, search, latest_posts, includes/comment_form
Чек-лист самопроверки
- Понимаю, зачем
get_absolute_url, и как с ним поменять адреса без правки шаблонов. - Умею добавить пагинацию в функцию и в
ListView. - Знаю, когда использовать
save(commit=False). - Могу объяснить, почему
Count("tags")послеfilter(tags__in=...)считает общие теги. - Понимаю разницу между
simple_tagиinclusion_tag. - Знаю, зачем
config="russian"в полнотекстовом поиске.
Что дальше
Блог пока анонимный: комментарии оставляют по имени и email, посты пишет только админ. В следующем модуле добавим пользователей: регистрацию, вход, восстановление пароля, профили, вход через соцсети и красивый дизайн на Bootstrap 5.
Практика решено 0 из 5
Какой инструмент выбрать, чтобы показать «последние посты» в боковой панели на всех страницах блога?
Какие функции блога работают только с PostgreSQL?
Восстановите порядок, в котором мы развивали блог во второй части.
- SEO-адреса с датой и слагом
- Карта сайта
- Отправка поста по email
- PostgreSQL и полнотекстовый поиск
- Свои шаблонные теги и фильтры
- Пагинация
- Теги и похожие посты
- Комментарии
Контрольное задание: view post_list с тегами и пагинацией. Напишите тело функции:
опубликованные посты; если передан tag_slug — фильтр по тегу; пагинация по 3; рендер blog/post/list.html
с posts и tag.
def post_list(request, tag_slug=None):
post_list = Post.published.all()
tag = None
if tag_slug:
tag = get_object_or_404(Tag, slug=tag_slug)
post_list = post_list.filter(tags__in=[tag])
paginator = Paginator(post_list, 3)
posts = paginator.get_page(request.GET.get("page", 1))
return render(request, "blog/post/list.html", {"posts": posts, "tag": tag})
Убедитесь, что в вашем блоге работают: пагинация, комментарии, теги, похожие посты, боковая панель, sitemap.xml, RSS и поиск. Нажмите, когда всё проверите.
Войдите, чтобы отмечать пройденные уроки.