【问题标题】:changeing ListView get_queryset? pagination in django更改 ListView get_queryset? django中的分页
【发布时间】:2021-08-09 00:10:09
【问题描述】:

大家好。 我在 django 的分页器上遇到了一些问题。 我的数据库中有所有客户信息,所以我想做的是显示该信息,但我创建了一个搜索功能,您可以在其中单击一个字母按钮,例如您单击 A,它将过滤他们的所有客户姓氏以字母 A 开头,如果单击 B ,它将过滤所有姓氏以 B 开头的客户,依此类推。这可以正常工作,问题是我还想在每页显示 10 个客户,所以如果我有 20 个客户,他们的姓氏以字母 A 开头,你会看到 10 个客户和一个显示 (>> ) 或类似的东西,应该用分页器解决,我添加了它,但它不起作用。 我认为问题在于,也许我的 get 函数正在从 ListView 重写 get_query 函数?我尝试了不同的东西,但我不确定。 这是我在视图中的代码:

class ExpedientView(ListView):
    queryset = Portfolio.objects.filter(products__isnull=True).order_by('owner__last_name')
    template_name = 'dashboard-admin/portfoliorecords.html'
    paginate_by = 10

    def get(self,request):
        if request.GET['letter'] == '':
            context_object_name = 'portfolios'
            queryset = Portfolio.objects.filter(products__isnull=True).order_by('owner__last_name')
            context = queryset
        else:
            letter = request.GET['letter']
            context_object_name = 'portfolios'
            queryset = Portfolio.objects.filter(products__isnull=True).order_by('owner__last_name').filter(owner__last_name__istartswith=letter)
            context = queryset
        return render(request, 'dashboard-admin/portfoliorecords.html', {'portfolios': context})

get(self,request) 函数完美运行,但是 paginated_by 的第一部分不起作用。

在我添加get函数之前,只过滤所有客户,分页器工作正常,所以在模板中,代码正常工作。

【问题讨论】:

    标签: python django listview search paginator


    【解决方案1】:

    您必须修改def get_queryset(self) 方法而不是def get(self, request) 方法

    删除def get(self, request) 方法和下面的代码。

    def get_queryset(self):
        queryset = Portfolio.objects.filter(products__isnull=True).order_by('owner__last_name')
        letter = request.GET.get('letter', None)
        if letter:
            queryset.filter(owner__last_name__istartswith=letter)
        return queryset
    

    【讨论】:

      【解决方案2】:

      如果您需要做的只是动态更改查询集,那么您应该重写get_queryset,而不是覆盖get(它会调用视图中的相应函数,这将执行所有分页任务等)。 /p>

      class ExpedientView(ListView):
          queryset = Portfolio.objects.filter(products__isnull=True)
          template_name = 'dashboard-admin/portfoliorecords.html'
          paginate_by = 10
          ordering = 'owner__last_name' # Put the ordering here instead of specifying it in the queryset
      
          def get_queryset(self):
              queryset = super().get_queryset()
              letter = self.request.GET.get('letter')
              if letter:
                  queryset = queryset.filter(owner__last_name__istartswith=letter)
              return queryset
      

      【讨论】:

      • 我明白了,与其更改原始 ListView 类中的 get 函数,不如将所有内容放入 get_queryset 中更容易。
      • 这很好用。然而,一旦这个工作大声笑,就会出现另一个问题。我在模板上所做的是通过 GET 方法发送信息,如下所示:
        但是,分页器可以工作,但是当您更改页面时,假设更改为第 2 页,而不是 mypage.com/expediente?letter=A,它会更改为 mypage。 com/expediente?page=2 并显示第二页的所有客户(由于没有变量 letter=A 不进行过滤)
      • @add 这是一个不同的问题,虽然很容易解决,但实际上你也会在 SO 上找到一些重复项,例如看这个:stackoverflow.com/questions/2047622/…
      猜你喜欢
      • 2013-02-04
      • 1970-01-01
      • 1970-01-01
      • 2022-10-05
      • 1970-01-01
      • 2020-04-01
      • 2019-01-03
      • 2014-11-29
      • 2011-03-22
      相关资源
      最近更新 更多