Почему эта функция (Django) «фильтр» не работает?

#django #django-views #django-templates #django-filter #django-pagination

Вопрос:

Мне нужна помощь, чтобы понять, почему фильтрация не работает. Это работало до тех пор, пока я не решил добавить разбиение на страницы с помощью официальных документов Django, и код взят отсюда.) Я проверил результаты запроса в оболочке Django (следуя инструкциям в документах ) и изменил код. Отображается сама разбивка на страницы, но вместо 5 элементов на каждой странице (как указано в строке paginator = Paginator(gem_list, 5) , отображаются все элементы-и то же самое на каждой странице. Поэтому я озадачен тем, в чем проблема-в filter детали или в шаблоне.

 #views.py

def gem_list(request):
   # gem_list = Rhyme.objects.filter(is_gem=True)
    rhyme_list = Rhyme.objects.all()
    objects= list(rhyme_list)     #converting the queryset to a list
    gem_list = objects.filter(is_gem=True)
    paginator = Paginator(gem_list, 5)
    page = request.GET.get('page', 1) 
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    page_range = paginator.get_elided_page_range(number=page) 
    
    try:
        page_obj = paginator.get_page(page_number)
    except PageNotAnInteger:
        page_obj = paginator.page(1)
    except EmptyPage:
        page_obj = paginator.page(paginator.num_pages)

    context = {
        'page_obj': page_obj,
        'gem_list' : gem_list,
        'paginator' : paginator,
        'page' : page,    
        }
    return render(request, 'rhymes/gem_list.html', context)

#template:
<div class="container">

{% for gem in gem_list %}

    <p class="rhyme_list"> <a href="{{ gem.get_absolute_url }}">{{gem}}</a></p>

{% endfor %}


<ul class="pagination justify-content-center flex-wrap mt-3 mb-4">
  {% if page_obj.has_previous %}
  <li class="page-item"><a class="page-link" href="?page=1">First</a></li>
      <li class="page-item"><a class="page-link" href="?page={{ page_obj.previous_page_number }}">Previous</a></li>
  {% else %}
      <li class="disabled page-item"><span class="page-link">Previous</span></li>
  {% endif %}
  {% for i in page_range|default_if_none:page_obj.paginator.get_elided_page_range %}
      {% if page_obj.number == i %}
          <li class="active page-item"><span class="page-link">{{ i }} <span class="sr-only">(current)</span></span>
          </li>
      {% else %}
          {% if i == page_obj.paginator.ELLIPSIS %}
              <li class="page-item"><span class="page-link">{{ i }}</span></li>
          {% else %}
              <li class="page-item"><a class="page-link" href="?page={{ i }}">{{ i }}</a></li>
          {% endif %}
      {% endif %}
  {% endfor %}
  {% if page_obj.has_next %}
      <li class="page-item"><a class="page-link" href="?page={{ page_obj.next_page_number }}">Next</a></li>
      <li class="page-item"><a class="page-link" href="?page={{ page_obj.paginator.num_pages }}">Last</a></li> 
  {% else %}
      <li class="disabled page-item"><span class="page-link">amp;raquo;</span></li>
  {% endif %}
</ul>


    #models.py
    class Rhyme(models.Model):
        rhyme = models.TextField(max_length=120)
        create_date = models.DateTimeField(auto_now_add=True)
        update_date = models.DateTimeField(auto_now=True)
        is_gem = models.BooleanField(default=False)
        contributor = models.ForeignKey(User, related_name="contributor", on_delete=models.CASCADE)

        class Meta:
        verbose_name_plural = "rhymes"

        def __str__(self):
            return self.rhyme

        @property
        def num_rhymes(self):
            return Rhyme.objects.all.count()

        @property
        def contributor_rhyme_count(self):
            return Rhyme.objects.filter(rhymes=self).count()

        def get_absolute_url(self):
            return reverse('rhyme_detail', args=[str(self.id)])

        def get_absolute_url(self):
            return "/rhymes/{}/".format(self.pk)

        # Metadata
        class Meta:
            ordering = ['rhyme']
 

Комментарии:

1. objects= list(rhyme_list) gem_list = objects.filter(is_gem=True) Можете ли вы отфильтровать после преобразования в список?

2. @DarrenG Я думаю, что ваш вопрос заключается в том, должен ли процесс фильтрации проходить до преобразования в список. Я играл с этим с первой фильтрацией («gem_list = Рифма.объекты.фильтр(is_gem=True) объекты= список(gem_list)»), но это, казалось, не возымело никакого эффекта.

Ответ №1:

Вы должны отобразить объекты страницы ( page_obj ) вместо полного списка драгоценных камней:

 {% for gem in page_obj %}

    <p class="rhyme_list"> <a href="{{ gem.get_absolute_url }}">{{gem}}</a></p>

{% endfor %}
 

Комментарии:

1. Это сработало! Я мог бы поклясться page_obj , что однажды пытался, но с таким количеством движущихся частей любая из них могла сбить меня с толку. Спасибо!