Как я могу постранично отобразить это представление?
Я пытаюсь преобразовать представление на основе функций в представление на основе классов для целей пагинации.
def tag(request, tag):
posts = Post.objects.filter(approved=True, tags__name__in=[tag]).order_by('-date_posted')
return render(request, 'blog/tag.html', {'tag': tag, 'posts': posts})
Я написал это так:
class TagView(ListView):
model = Post
template_name = 'blog/tag.html'
context_object_name = 'posts'
ordering = ['-date_posted']
paginate_by = 3
def get_queryset(self):
return Post.objects.filter(approved=True, tags__name__in=[tag]).order_by('-date_posted')
Но это не отображает никаких сообщений, когда я загружаю страницу. Может ли кто-нибудь сказать мне, почему так происходит? Или если вы знаете другой способ пагинации этого представления без преобразования его в представление на основе классов, это также было бы признательно. Заранее спасибо.
В вашем ListView вы не передаете никаких данных в переменную [tag], поэтому ваш набор запросов возвращается пустым. В зависимости от того, что вы передаете в нее, вам могут понадобиться или не понадобиться квадратные скобки [] вокруг нее в запросе.
Если вы используете один строковый тег, например, через URL /tag/myTag, то для передачи данных из URL в listview вы можете обновить метод get_queryset:
def get_queryset(self):
return Post.objects.filter(approved=True, tags__name__in=[self.kwargs['tag']]).order_by('-date_posted')
Если вы передаете фактический список тегов, вам может понадобиться установить его в переменной сессии в предыдущем представлении и вызвать его здесь
В предыдущем представлении
request.session['tags'] = list_of_tags
А в этом представлении
tags = request.session['tags']
return Post.objects.filter(approved=True, tags__name__in=tags).order_by('-date_posted')