Cat

Django 22. Представление для страницы поста

Сегодня мы напишем представление для страницы поста, а также добавим отображение постов на странице категории.

Все статьи

Icon Link

Дополнительные материалы

Icon Link

Реклама

Icon Link
Сайт на Django proDream 06 Сентябрь 2023 Просмотров: 761

Начнём с представления поста. 

Перейдём в файл 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.

И тут есть два варианта вывода постов в категории.

  1. Если нам нужно выводить посты строго в той категории, для которой они прописаны, то прописываем получение постов относящихся только к этой категории: posts = models.PostModel.objects.filter(category=category).
  2. Если нам надо, что бы посты отображались как в предназначающейся категории, так и в категории выше, как пример у меня категория Гайды и в ней категория 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, перейдите в панель администратора и добавьте несколько тестовых постов.
Затем перейдите на сайт и проверьте как всё работает.

 

Автор

    Нет комментариев

    Реклама