Как вывести название текущего тега в шаблон? (Тот, в котором мы находимся)
Я пытаюсь отобразить имя текущего тега, то есть того, в котором мы находимся. Не работает. Как правильно написать, чтобы отобразить тег в шаблоне?
#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