Пагинация в 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
. Чтобы пользователи могли перемещаться между страницами, добавьте ссылки на следующую и предыдущую страницу в ваш шаблон.