2011-03-24 77 views
0

我是一個真正的編程白人,我想確保這種方法足夠穩固。Django - 對以前過濾的列表進行排序

我想過濾我的模型的搜索結果,然後允許用戶根據各種變量對結果進行排序。我的想法是將過濾器變量作爲GET參數附加到排序鏈接(然後它將具有唯一的排序變量)。

我看過其他網站,似乎有可能是一個更優雅的解決方案(它們不包含巨大querystrings)。

有沒有更好的方法?

回答

0

爲了避免querystrings你可以使用Django的url路由。接下來的挑戰將是爲您的鏈接生成適當的網址。

Django有方便的url template tag。您可以使用它來確定給定網址名稱及其參數的網址。

在你的urls.py你可能會碰到這樣的:

url(r'^sort/(\d{4})/(\d{2})/$', 'funkysort', name='funkysort'), 

我使用url function **在我的URLconf(urls.py),使其更容易說出我的網址。我爲{%url%}模板標記命名了我的網址。

在您的模板,你可以再做:

{% url funkysort 5 10 %} 

和Django會產生類似:

/mysite/sort/5/10/ 

**注:這是不是網址模板標籤不同。如果您想在代碼中執行url模板標籤的等效功能,請使用reverse函數。

+0

呵呵,我不知道如何以這種方式發送參數給url函數,這很有用。 – Ben 2011-03-24 17:11:04

+0

儘管如此,儘管如此,我仍然需要用這種方法附加所有變量。我只是通過url路由而不是GET參數來實現的,對嗎? – Ben 2011-03-24 17:11:54

+0

我更喜歡GET進行排序,因爲它只是修改單個頁面的輸出,對於我來說,不同的URL意味着明顯分離的內容。我相信大家在這裏有自己的看法。 – 2011-03-26 04:13:29

0

如果你想縮短它的話,Django的管理員會使用像o = 3這樣的索引。

您可以將排序字段映射到索引或其他更漂亮的名稱。

sorts = { 
    0: 'field1', 
    1: 'field2', 
    2: 'field3', 
} 

qs = qs.order_by(sorts.get(request.GET.get('o'), 'id')) 

您需要添加升序/降序代碼,但這只是一個簡單的例子。

相關問題