2010-10-08 73 views
1

我在django泛型object_list函數的分頁方面遇到了一些麻煩,它們並不真正「足夠」以彌補我的愚蠢。Django通用object_list分頁。添加而不是替換參數

我正在嘗試使用可選參數爲頁碼和類別做一個URL列表。 在urls.py的URL看起來是這樣的:

url(r'^all/(?:(?P<category>[-\w]+)/page-(?P<urlpage>\d+))?/$', views.listing, ),

類別和urlpage參數是額外的可選怎麼一回事,因爲 「(?)?」在他們周圍,這很好地工作。 views.listing是一個包裝函數看起來像這樣(我不認爲這是哪裏出現我的問題):

def listing(request,category="a-z",urlpage="1"): 
extra_context_dict={} 
if category=="a-z": 
    catqueryset=models.UserProfile.objects.all().order_by('user__username') 
elif category=="z-a": 
    catqueryset=models.UserProfile.objects.all().order_by(-'user__username') 
else: 
    extra_context_dict['error_message']='Unfortunately a sorting error occurred, content is listed in alphabetical order' 
    catqueryset=models.UserProfile.objects.all().order_by('user__username') 
return object_list(
        request, 
        queryset=catqueryset, 
        template_name='userlist.html', 
        page=urlpage, 
        paginate_by=10, 
        extra_context=extra_context_dict, 
        ) 

在我的模板userlist.html我看像這樣的鏈接(這是我想真正的問題在於):

{%if has_next%} 
    <a href=page-{{next}}>Next Page> ({{next}})</a> 
{%else%} 

而不是替換我的網址中的頁面參數鏈接添加到網址的另一個頁面參數。網址最終看起來像這樣「/所有/ AZ /頁,1/頁-2/

這並不令人驚訝的是,這是發生了什麼,但沒有頁面作爲可選參數的實際工作和Django的替換URL的舊頁面的一部分。

我寧願這個機(至少我是這麼認爲的)解決方案,但似乎無法得到它的工作。 任何提示,這是怎麼更好的urls.py或得到解決模板標籤將非常讚賞。

(也請原諒非母語英語和動態翻譯的代碼。任何反饋,如果這是一個好的或無根據的Stack-溢出的問題也很樂意採用)

回答

1

你在這裏使用的是相對URL - 所以這與Django沒什麼關係。你可以取代你的鏈接:

<a href="/all/a-z/page-{{ next }}">Next Page> ({{ next }})</a> 

和一切都會很好,除了事實,你必須在你的模板中的脆性聯繫,因爲你改變了你的urls.py其將盡快打破,它止跌除非category碰巧是a-z才行。

相反,使用Django的內置url標籤。

<a href="{% url views.listing category next %}">Next Page> ({{ next }})</a> 

爲了使這項工作,你有你的類別傳遞到extra_context_dict,你對你的看法,第一行代碼創建:

extra_context_dict = { 'category': category } 
+0

雖然所有給出的解決方案都可以工作(謝謝大家),但你的解決方案不僅解決了我的問題,而且給了我一個更好的方式來使用django。這看起來非常鬆散,我的猴子補丁項目真的需要。謝謝多米尼克! BTW。我正在使用命名的URL而不是命名的視圖,爲什麼這在django開發人員中似乎不受歡迎呢?編輯:太慢編輯第一個:( – Tobias 2010-10-08 18:18:03

+0

@Tobias - 很高興我可以幫助 - 謝謝!我不知道爲什麼(或確實是否)命名的URL在Django開發人員中不受歡迎 - 我一直使用命名的URL。就此提出一個單獨的問題(幷包括證據表明它們不受歡迎!)。 – 2010-10-10 14:05:34

0

/all/a-z/page-1/page-2/什麼會出現在源或鏈接帶你去的地方?我的猜測是,瀏覽器將字符串「page-2」附加到當前URL。您應該從帶有/的URL開始,以表示完整路徑。

很可能需要添加的類別爲extra_context,做:

<a href="/all/{{category}}/page-{{next}}">next page ({{next}})</a> 
0

「而不是在我的網址替換頁面參數的鏈接添加了另一頁參數的URL網址,最終看起來是這樣的。 「/所有/ AZ /頁-1 /頁-2 /」

,這是因爲

'<a href=page-{{next}}>Next Page> ({{next}})</a>' 

鏈接到相對於當前URL頁面和當前的URL是人準備好/ page-1 /在裏面。

我不知道怎麼樣,沒有頁面作爲可選參數的實際工作和Django的替換URL

一兩件事,我建議是不是定義相對URL的舊頁面部分定義絕對URL

'<a href="/<other-part-of-url>/page-{{ next }}">Next Page> ({{ next }})</a>' 
相關問題