为啥这个(Django)“过滤器”功能不起作用?

Posted

技术标签:

【中文标题】为啥这个(Django)“过滤器”功能不起作用?【英文标题】:Why is this (Django) 'filter' function not working?为什么这个(Django)“过滤器”功能不起作用? 【发布时间】:2021-10-15 06:56:58 【问题描述】:

我需要帮助找出过滤不起作用的原因。它一直有效,直到我决定使用 Django official docs 添加分页,代码来自 here。)我在 Django shell 中测试了查询结果(按照文档中的步骤)并调整了代码。分页本身会显示,但不是每页上的 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">&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']

【问题讨论】:

objects= list(rhyme_list) gem_list = objects.filter(is_gem=True) 转换为列表后可以过滤吗? @DarrenG 我认为您的问题是关于过滤过程是否应该在转换为列表之前进行。我已经先使用过滤器(` gem_list = Rhyme.objects.filter(is_gem=True) objects= list(gem_list)`),但这似乎没有效果。 【参考方案1】:

您必须显示页面对象 (page_obj) 而不是完整的 gem_list:

% for gem in page_obj %

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

% endfor %

【讨论】:

成功了!我可以发誓我试过page_obj 一次,但是有这么多活动部件,任何一个部件都可能让我失望。谢谢!

以上是关于为啥这个(Django)“过滤器”功能不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 style 属性中定义的这个内联 SVG 过滤器不起作用?

为啥引导程序不起作用,尽管我已经加载了它等(Django 项目)?

为啥这个 Django 日志记录不起作用?

DateField 的 Django 模型过滤器不起作用

使用 templatetags 方法的 Django 自定义过滤器不起作用!异常值为:无效过滤器:'dict_'

Django 自定义模板过滤器不起作用