Пагинация в Django ListView при использовании get_context_data

В настоящее время я столкнулся с этой проблемой с Django ListView. По сути, мне нужно отфильтровать некоторые вопросы по темам и я хотел бы постранично отобразить результаты. Мой код отлично работает в части queryset (результаты отображаются правильно), но я столкнулся с проблемой пагинации. Допустим, в моем запросе пока 8 элементов, если я выбираю paginate_by = 10, он показывает мне только одну страницу. Если же я выбираю пагинацию, скажем, по 3, то в шаблоне отображается 3 страницы для выбора (что правильно), но на моей странице отображаются ВСЕ результаты запроса. Привожу код, чтобы было понятнее

models.py:

class Tag(models.Model):
name = models.CharField(max_length=300, unique=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)

def clean(self):
    self.name = self.name.capitalize()

def __str__(self):
    return self.name


class Question(models.Model):
    post_owner = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=5000, default='')
    body = tinymce_models.HTMLField()
    tags = models.ManyToManyField(
        Tag, related_name='tags')
    viewers = models.ManyToManyField(
        User, related_name='viewed_posts', blank=True)

views.py:

class TagQuestionsListView(ListView):
template_name = 'main/tag_questions.html'
paginate_by = 20

def get_queryset(self, **kwargs):
    tag = Tag.objects.get(name=self.kwargs['name'])
    questions = Question.objects.filter(tags=tag)
    return questions

def get_contextdata(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['tag'] = Tag.objects.get(name=self.kwargs['name'])
    context['questions'] = Question.objects.filter(
        tags=context['tag'], is_deleted=False)
    return context

template:

Я хочу, чтобы мой конвертер комментариев ответил на мой комментарий.

Вы должны использовать page_obj вместо questions в вашем шаблоне.

<--!               ⬇️⬇️⬇️      -->
{% for question in page_obj %}
<div class="row">
    <div class="col-2 ms-2">
        <p>{{ question.count_all_the_votes }} Voti</p>
        <p>{{ question.count_answers }} Risposte</p>
        <p>{{ question.calculate_viewers }} Visualizzazioni</p>
    </div>
    <div class="col-9">
        <a href="{% url 'main:question_details' pk=question.id slug=question.slug %}"><h5>{{question.title}}</h5></a>
        <div class="text">
            {{ question.body|striptags }}
        </div>
        {% for tag in question.tags.all %}
        <a class="btn btn-sm btn-outline-primary m-1" href="{% url 'main:tag_questions' name=tag.name %}">{{tag.name}}</a>
        {% endfor %}
        <div class="float-end">
            <a style="display: inline;" href="">{{question.post_owner}}</a> 
            {% if question.is_edited == False %}
            <span style="display:inline;">creata {{question.created_at | naturaltime}}</span>
            {% else %}
            <span style="display:inline;"> modificata {{question.edited_time | naturaltime}} da <a style="display: inline;" href="">{{question.edited_by.username}}</a></span>
            {% endif %}
        </div>
    </div>
</div>
<hr>
{% endfor %}

Так, если вы определяете атрибут paginate_by, то ListView(django docs) добавляет paginator и page_obj к context. Чтобы пользователи могли перемещаться между страницами, добавьте ссылки на следующую и предыдущую страницу в ваш шаблон.

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