Как вывести название текущего тега в шаблон? (Тот, в котором мы находимся)

Я пытаюсь отобразить имя текущего тега, то есть того, в котором мы находимся. Не работает. Как правильно написать, чтобы отобразить тег в шаблоне?

        #Models

        from django.db import models
        from taggit.managers import TaggableManager


        class Blog(models.Model):
            title = models.CharField(max_length=150)
            created_at = models.DateTimeField(auto_now_add=True)
            description = models.CharField(max_length=550)
            tags = TaggableManager()
    
            def __str__(self):
                return self.title


        #Views

        from django.shortcuts import render
        from django.views.generic import ListView
        from .models import *
        from taggit.models import Tag


        class TagMixin(object):
              def get_context_data(self, **kwargs):
                  context = super(TagMixin, self).get_context_data(**kwargs)
                  context['tags'] = Tag.objects.all()
                  return context

        class PostIndexView(TagMixin,ListView):
            model = Blog
            template_name = 'blog.html'
            queryset=Blog.objects.all()
            context_object_name = 'posts'

        class TagIndexView(TagMixin,ListView):
            model = Blog
            template_name = 'blog.html'
            context_object_name = 'posts'

            def get_queryset(self):
                return Blog.objects.filter(tags__slug=self.kwargs.get('tag_slug'))


        #Templates

        {% if tag %}
             <h3>Posts by tag: {{ tag }}</h3>  <!-- Does not display tag name -->
        {% endif %}

        

P.s. Сайт просит больше описания, но что еще можно описать здесь? Проблема с выводом описана

Если я правильно понял - у вас в шаблоне нет переменной tag. У вас есть tags. В этом случае:

#Templates
{% for tag in tags %}
    <h3>Posts by tag: {{ tag }}</h3>
{% endfor %}

Если вы хотите иметь специальный tag_slug в контексте - вы должны добавить его в контекст вручную, как вы делаете это с tags. Или вы можете использовать эту конструкцию:

#Templates
{% if view.kwargs.tag_slug %}
    <h3>Posts by tag: {{ view.kwargs.tag_slug }}</h3>
{% endif %}

Кроме того, если вы хотите иметь только 1 текущий тег, вы должны отфильтровать его:

class TagMixin(object):
    def get_context_data(self, **kwargs):
        context = super(TagMixin, self).get_context_data(**kwargs)
        context['tags'] = Tag.objects.all()
        context['tag'] = Tag.objects.filter(slug=self.kwargs.get('tag_slug', '')).first()
        return context

Кстати, __str__ всегда должен возвращать тип str. Прямое преобразование в строку предпочтительнее:

class Blog(models.Model):
    def __str__(self):
        return f'{self.title}'

В новом Python можно конкатенировать массивы и можно иметь пустой super, а классы являются по умолчанию дочерними от object:

class TagMixin:
      def get_context_data(self, **kwargs):
          return super().get_context_data(**kwargs) | {'tags' : Tag.objects.all()}

Для общего ListView вам не нужно определять queryset и model. Достаточно одного из них. Определить queryset на пару микросекунд быстрее, чем model. Также вам не нужно переопределять имя шаблона и имя_объекта_контекста. Просто используйте стандартные blogs_list и blogs_app/blogs_list.html

class PostIndexView(TagMixin,ListView):
    queryset=Blog.objects.all()
    # Thats all, you dont need any other attributes

    
Вернуться на верх