簡體   English   中英

改變 ListView get_queryset? django 中的分頁

[英]changeing ListView get_queryset? pagination in django

今天是個好日子。 我在使用 django 中的分頁器時遇到了一些問題。 我的數據庫中有所有客戶信息,所以我想做的是顯示該信息,但我進行了搜索 function 在其中單擊字母按鈕,例如單擊 A,它將過濾所有客戶姓氏以字母A開頭,如果單擊B,它將過濾所有姓氏以B開頭的客戶,依此類推。 這可以正常工作,問題是我還想在每頁顯示 10 個客戶,所以如果我有 20 個客戶,他們的姓氏以字母 A 開頭,你會看到 10 個客戶和一個顯示 (< << page 1 page 2 >>> ) 或類似的東西,應該用分頁器解決,我添加了它,但它不起作用。 我認為問題在於,也許我得到的 function 正在重寫來自 ListView 的 get_query function? 我嘗試了不同的東西,但我不確定。 這是我在視圖中的代碼:

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) function 運行良好,但是 paginated_by 的第一部分不起作用。

在我添加 get function 並過濾所有客戶之前,分頁器工作正常,所以在模板中,代碼工作正常。

如果您需要做的只是動態更改查詢集,那么您應該重寫get_queryset而不是覆蓋get (它會調用視圖中的相應函數,這將執行所有分頁任務等):

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

您必須修改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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM