Django 22. Представление для страницы поста
Сегодня мы напишем представление для страницы поста, а также добавим отображение постов на странице категории.
Дополнительные материалы
Для скачивания материалов необходимо войти или зарегистрироваться
Файлы также можно получить в Telegram-боте по коду: 220049
Реклама
Начнём с представления поста.
Перейдём в файл views.py
и напишем функцию post_page
, передавая те же аргументы, что и для представления категорий, а именно request
, pk
и slug
.
В теле функции создадим переменную post
и так же как мы делали для категории, получим из модели конкретный пост.
Создаём переменную context
с переменной post
и делаем возврат рендера.
Код:
def post_page(request, pk, slug):
post = models.PostModel.objects.get(pk=pk)
post.views += 1
post.save()
context = {
'post': post,
}
return render(request,
'blog/post_page.html',
context)
Вывод постов на странице категории.
Теперь изменим функцию category_page
. Под переменной category
, создаём ещё одну с именем posts
.
И тут есть два варианта вывода постов в категории.
- Если нам нужно выводить посты строго в той категории, для которой они прописаны, то прописываем получение постов относящихся только к этой категории:
posts = models.PostModel.objects.filter(category=category)
. - Если нам надо, что бы посты отображались как в предназначающейся категории, так и в категории выше, как пример у меня категория
Гайды
и в ней категорияDjango
. То создаём две переменные. В одной мы получаем список категорий, а во второй получаем посты относящиеся к категориям из списка:
descendant_categories = category.get_descendants(include_self=True)
posts = models.PostModel.objects.filter(category__in=descendant_categories)
Код:
# Первый вариант
posts = models.PostModel.objects.filter(category=category)
# Второй вариант
descendant_categories = category.get_descendants(include_self=True)
posts = models.PostModel.objects.filter(category__in=descendant_categories)
context = {
'category': category,
'posts': posts,
}
Для себя, выбрал второй вариант.
Представления написаны, перейдём к шаблонам.
Сперва изменим шаблон страницы категории.
Откроем файл category_page.html
в директории с шаблонами.
Под секцией с выводом информации о категории, напишем новую секцию, в которой будем через цикл for
выводить элементы.
Код:
<section class="posts">
<div class="container">
<hr>
{% for post in posts %}
<h2><a href="{{ post.get_absolute_url }}">{{ post.title }}</a></h2>
<p>{{ post.short_body | safe }}</p>
<hr>
{% endfor %}
</div>
</section>
Теперь перейдём к странице поста.
Создадим файл post_page.html
.
Подключим базовый шаблон, пропишем блок с контентом и внутри вывод информации о посте.
Код:
{% extends "blog/base.html" %}
{% block title %}{{ post.title }}{% endblock %}
{% block content %}
<section class="post">
<div class="container">
<h1>{{ post.title }}</h1>
<p>{{ post.full_body | safe }}</p>
</div>
</section>
{% endblock %}
Осталось всё проверить.
Запустите Django, перейдите в панель администратора и добавьте несколько тестовых постов.
Затем перейдите на сайт и проверьте как всё работает.
Все статьи