2013-07-18 80 views
1

我遇到了一個奇怪的問題,雖然我現在已經找到了一個解決方案,但我認爲了解導致錯誤的原因會很有幫助。我有一個Django項目的應用程序和網址如下:django中的網址排序

urlpatterns = patterns('', 
    url(r'^$', UserProfileListView.as_view(), 
     name='userprofile_list'), 
    url(r'^(?P<username>[\[email protected]+-_]+)/changepassword/$', 
     password_change, name='change_password'), 
    url(r'^(?P<username>[\[email protected]+-_]+)/$', 
     profile_detail, 
     name='userprofile_detail'), 
) 

當我將瀏覽器指向change_password一切工作正常。不過是我的URL命令如下:

urlpatterns = patterns('', 
url(r'^$', UserProfileListView.as_view(), 
    name='userprofile_list'), 
url(r'^(?P<username>[\[email protected]+-_]+)/$', 
    profile_detail, 
    name='userprofile_detail'), 
url(r'^(?P<username>[\[email protected]+-_]+)/changepassword/$', 
    password_change, name='change_password'), 

) 

我得到一個錯誤,由於404頁,未發現該視圖獲取的用戶名=用戶名/ changepassword而不是用戶名的事實=用戶名

會是什麼是否以這種方式解釋網址的原因,以及爲什麼它在第一種情況下工作?

+3

因爲第一正則表達式捕獲兩者。這就是訂單很重要的原因。 –

回答

2

Dan Klasson的評論就是答案。只是爲了詳細一點,你可以很容易地通過測試你的正則表達式發現:

>>> import re 
>>> re.match(r"^(?P<username>[\[email protected]+-_]+)/$", "foobar/changepassword/") 
<_sre.SRE_Match object at 0x7f949c54be40> 

FWIW問題與\w符這可能不是做的正是你所期望的:

>>> re.match(r"\w", "foobar/changepassword/") 
<_sre.SRE_Match object at 0x7f949c5a1d30>