Django 25. Добавляем теги к постам
В этом посте, мы добавим в модель поста теги и добавим отображение на сайте.
Дополнительные материалы
Для скачивания материалов необходимо войти или зарегистрироваться
Файлы также можно получить в Telegram-боте по коду: 772231
Реклама
Теги являются важной частью любого информационного ресурса.
- Теги улучшают поисковую оптимизацию. Позволяют выделить ключевые слова в поиске.
- Фильтрация контента и создание связей на сайте. Пользователь сможет выбрать необходимый тег и посмотреть связанные с ним материалы.
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'),
Вот и всё, теперь у постов есть теги.
Все статьи