亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Django 分頁——維護過濾器和排序方式

Django 分頁——維護過濾器和排序方式

慕工程0101907 2022-07-12 10:22:22
我有一個小型 Django 項目basic-pagination。有一個模型、一個表單和兩個視圖(列表視圖、表單視圖)。用戶在表單視圖中提交數據,然后數據顯示在列表視圖中。啟用分頁以一次僅顯示 5 個帖子。我實現的是一個帶有 GET 響應的表單,用于獲取我想要顯示的數據(例如姓名、日期)。請參閱下面的代碼class FormListView(ListView):    model = models.ToDoList    paginate_by = 5  # if pagination is desired    template_name = 'pagination/listview.html'    context_object_name = 'forms'    def get_context_data(self, **kwargs):        context = super().get_context_data(**kwargs)        context['title'] = 'Form List View'        context['filter_form'] = forms.FilterListView(self.request.GET)        return context    def get_queryset(self):        queryset = models.ToDoList.objects.all().order_by('-id')        name = self.request.GET.get('name')        if name:            queryset = queryset.filter(name=name)        order_by = self.request.GET.get('order_by')        if order_by:            queryset = queryset.order_by(order_by)        print(queryset)        return queryset問題是,如果您從一個頁面移動到另一個頁面,那么基于類的視圖會調用該方法ListView,從而丟失了我想要的過濾查詢集。get_queryset12如何在整個分頁過程中保持過濾?
查看完整描述

2 回答

?
蝴蝶不菲

TA貢獻1810條經驗 獲得超4個贊

正如@WillemVanOnsem 指出的那樣,問題不在于視圖,而在于模板中的 URL(templates/pagination/listview.html)。以前,下一個按鈕href="?page={{ page_obj.next_page_number }}"意味著request.GET它只包含用于分頁的頁碼,而不包含其他過濾器和按條件排序。


然后解決方案是附加request.GET.urlencode到href喜歡


<a class="btn btn-outline-info mb-4" href="?page={{ page_obj.next_page_number }}&{{ request.GET.urlencode }}">Next</a>

但是,這不是一個徹底的解決方案,因為簡單地附加request.GET也會附加您當前所在的頁碼。簡單地說,如果你從第 1 頁跳轉到第 2 頁再到第 3 頁,你最終會得到一個看起來像這樣的 URL


http://localhost:8000/listview/?page=1&page=2&page=3...

這request.GET是一個 QueryDict 之類的<QueryDict: {'page': ['1'], ...}>。對此的解決方案是簡單地彈出page參數,但是,因為request.GET它是不可變的,您首先必須制作它的副本。本質上,我get_context_data在 ListVew 中的方法中添加了以下幾行


def get_context_data(self, **kwargs):

    context = super().get_context_data(**kwargs)

    context['title'] = 'Form List View'

    context['filter_form'] = forms.FilterListView(self.request.GET)

    get_copy = self.request.GET.copy()

    if get_copy.get('page'):

        get_copy.pop('page')

    context['get_copy'] = get_copy

    return context

在模板中,我將get_copy對象稱為href="?page={{ page_obj.next_page_number }}&{{ get_copy.urlencode }}"


對于整個模板示例,請遵循templates/pagination/listview.html


不是最優雅的解決方案,但我覺得它對大多數人來說足夠簡單。


查看完整回答
反對 回復 2022-07-12
?
慕哥9229398

TA貢獻1877條經驗 獲得超6個贊

我遇到了同樣的問題,我通過下面的鏈接解決了這個問題。

https://www.caktusgroup.com/blog/2018/10/18/filtering-and-pagination-django/


查看完整回答
反對 回復 2022-07-12
  • 2 回答
  • 0 關注
  • 169 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號