Как я могу постранично отобразить это представление?

Я пытаюсь преобразовать представление на основе функций в представление на основе классов для целей пагинации.

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')
Вернуться на верх