Cat

Django 25. Добавляем теги к постам

В этом посте, мы добавим в модель поста теги и добавим отображение на сайте.

Все статьи

Icon Link

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

Icon Link

Реклама

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

Теги являются важной частью любого информационного ресурса.

  • Теги улучшают поисковую оптимизацию. Позволяют выделить ключевые слова в поиске.
  • Фильтрация контента и создание связей на сайте. Пользователь сможет выбрать необходимый тег и посмотреть связанные с ним материалы.

 

django-taggit.

Для того чтобы добавить поддержку тегов в Django есть отличная библиотека django-taggit.

Установим библиотеку и добавим её в requirements.txt:

pip install django-taggit

 

И taggit добавим в INSTALLED_APPS.

 

Поле для тега.

Перейдём в файл models.py и найдём класс поста PostModel.

В нём добавим новое поле:

from taggit.managers import TaggableManager

tags = TaggableManager(blank=True)

 

Применим миграции:

python manage.py makemigrations
python manage.py migrate

 

Представление для тега.

Для вывода постов прикреплённых к тегу, сделаем новое представление и шаблон.

Перейдём в файл views.py и создадим новую функцию tag_page. Функция будет принимать в себя традиционный request и tag_name.

В теле функции в переменную posts получим отфильтрованные по имени тега посты.

posts = models.PostModel.objects.filter(tags__slug=tag_name).distinct()

 

Затем напишем контекст, содержащий имя тега и список постов.

context = {  
    'tag_name': tag_name,  
    'posts': posts  
}

 

И возвращаем рендер страницы.

 

Код функции:

def tag_page(request, tag_name):  
    posts = models.PostModel.objects.filter(tags__slug=tag_name).distinct()  

    context = {  
        'tag_name': tag_name,  
        'posts': posts  
    }  

    return render(request,  
                  'blog/tag_page.html',  
                  context)

 

Шаблон страницы тега.

Перейдём в директорию с шаблонами и создадим файл tag_page.html.
Напишем простой шаблон (расширенный смотрите в материалах к посту):

{% extends "blog/base.html" %}
{% block title %}{{ tag_name | title }}{% endblock %}
{% block content %}
        <div class="container">
            <h1>{{ tag_name | title }}</h1>
            <p>На этой странице представлены посты, отсортированные по имени тега {{ tag_name }}.</p>
            <hr>
        <div class="col-lg-9 col-sm-12 cat-block">
                    {% for post in posts %}
                        <div class="row">
                            <div class="col-lg-8 col-sm-12">
                                <h4><a href="{{ post.get_absolute_url }}">{{ post.title }}</a></h4>
                                <p class="lead"><a href="{{ post.category.get_absolute_url }}">{{ post.category }}</a>
                                    | {{ post.author }} | {{ post.publish | date:"d F Y" }}</p>
                                {% for tag in post.tags.all %}
                                    <a href="{% url 'blog:tag_page' tag.slug %}"><span
                                            class="badge bg-success">{{ tag.name }}</span></a>
                                {% endfor %}
                            </div>
                        </div>
                        <hr class="m-3">
                    {% endfor %}
                </div>
        </div>
{% endblock %}

 

В файле latest_posts.html и post_page.html добавим отображение тегов:

{% for tag in post.tags.all %}  
    <a href="{% url 'blog:tag_page' tag.slug %}"><span class="badge bg-success">{{ tag.name }}</span></a>  
{% endfor %}

 

И, чтобы страницы тегов заработали, перейдём в urls.py и добавим в паттерны сайта новую страницу. Используем регулярное выражение в качестве паттерна для поддержки тегов на кириллице:

from django.urls import path, re_path

re_path(r'/(?P<tag_name>[\w-]+)/$', views.tag_page, name='tag_page'),

 

Вот и всё, теперь у постов есть теги.

 

Автор

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

    Реклама