2017-09-05 129 views
0

我正在使用Django分頁,並且一切都工作正常,除了只有一個頁面排序。Django分頁不會排序第二頁

我曾嘗試:

if request.method == 'POST': 
    if request.POST.get('sort_by') == 'price': 
     products_list = Product.objects.filter(category = category).order_by('price') 
     selected_sort_price = "selected" 
    elif request.POST.get('sort_by') == 'name': 
     products_list = Product.objects.filter(category = category).order_by('name') 
     selected_sort_name = "selected" 
    elif request.POST.get('sort_by') == 'date': 
     products_list = Product.objects.filter(category = category).order_by('-id') 
     selected_sort_date = "selected" 
    show=request.POST.get('show', 5) 
else: 
    products_list=Product.objects.filter(category = category).order_by('-id') 
... 
page = request.GET.get('page', 1) 
paginator = Paginator(products_list, show) 
try: 
    products = paginator.page(page) 
except PageNotAnInteger: 
    products = paginator.page(1) 
except EmptyPage: 
    products = paginator.page(paginator.num_pages) 

以上僅當有來電後,如果沒有呼叫後,則按照創建日期排序工作。

因此,如果用戶想按價格排序,他會從下拉菜單中選擇價格,然後onchange表單將被提交併且相應地對對象進行排序。問題是,當用戶轉到第二頁時,所有內容都會回到默認值,因爲不會發出任何郵寄呼叫,並且以前的發佈數據不會保留。

我能做些什麼來使排序適用於所有頁面?

尋找一些方向,

+1

首先,爲什麼要使用POST?您不會修改任何服務器數據,只是檢索參數,相當於搜索表單或類別鏈接。所以對於GET,你使用'request.GET'。要處理模板中的動態查詢字符串,請查看[here](https://stackoverflow.com/q/5755150/1600649)以獲取靈感。 – Melvyn

回答

1

在你看來,你應該使用GET方法獲得sort_by PARAM,然後,您可以返回sort_by到模板的下一個頁面,你可以嘗試:

show=request.POST.get('show', 5) 
sort_by = '-id' 
if reques.GET.get('sort_by'): 
    if reques.GET.get('sort_by') in ['price', 'name', 'date']: 
     sort_by= request.GET.get('sort_by') 

products_list = Product.objects.filter(category=category).order_by(sort_by) 

paginator = Paginator(products_list, show) 
page = request.GET.get('page', 1) 

try: 
    products = paginator.page(page) 
except PageNotAnInteger: 
    products = paginator.page(1) 
except EmptyPage: 
    products = paginator.page(paginator.num_pages) 

return render(request, 'my_template.html', {'products': products, 'sort_by': sort_by}) 

在您的模板,添加sort_by param上一頁/下一頁鏈接:

{% for product in products %} 
    ... 
{% endfor %} 

<div class="pagination"> 
    <span class="step-links"> 
     {% if products.has_previous %} 
      <a href="?sort_by={{ sort_by }}&page={{ products.previous_page_number }}">previous</a> 
     {% endif %} 

     <span class="current"> 
      Page {{ products.number }} of {{ products.paginator.num_pages }}. 
     </span> 

     {% if contacts.has_next %} 
      <a href="??sort_by={{ sort_by }}&page={{ products.next_page_number }}">next</a> 
     {% endif %} 
    </span> 
</div> 

我希望這是有用的。

+0

這幫助我走向了正確的方向,謝謝。任何想法如何獲得模板current_page數字?是否有像{{products.current_page_number}}這樣的基本標籤? –

+0

沒關係,我剛剛意識到當前頁面只是{{products.number}},謝謝。 –

1

像@Melvyn說你應該使用GET方法。當您將敏感信息發送到服務器或將數據保存到服務器時,請僅使用POST。

get方法的一個例子應該是:

if reques.GET.get('sort_by'): 
    prince = request.GET.get('sort_by') 
    products_list = Product.objects.filter(category = category).order_by(price) 
    selected_sort_price = "selected" 

我沒有你的項目足夠的信息,所以我不能幫你。無論如何告訴我,如果這項工作。

+0

Melvyn對我的部分POST的錯誤用法是正確的,但這會如何改變?如果用戶轉到第二頁,結果是否仍然像第一頁那樣排序?我可以通過url傳遞參數,比如'sort_by = price',我可以通過請求在views.py中訪問它,但分頁的第二頁也不起作用,因爲'sort_by = price'會是換成'?page = 2'。 –

+0

嗯,我不知道如何去你的項目,但看看如何使用getover方法來定購它的頁面,其相似的東西你正在尋找 –