Начнём с представления поста.
Перейдём в файл 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, перейдите в панель администратора и добавьте несколько тестовых постов.
Затем перейдите на сайт и проверьте как всё работает.


Комментарии
Оставить комментарийВойдите, чтобы оставить комментарий.
Комментариев пока нет.