2014-08-29 26 views
1

有什麼我不明白哪些與我的應用程序發生。 這是django文檔說的。Django的網址格局順序和正則表達式

  1. Django runs through each URL pattern, in order, and stops at the first one that matches the requested URL.

這是我的url模式,它的工作原理。

urlpatterns = patterns('', 

    #rosa 
    url(r'^league/(.+)/rose/$','fantacalcio.views.rose',name='rose'), 
    #league page 
    url(r'^league/(.+)/$', 'fantacalcio.views.league_home',name='league_home'), 
) 

這是我希望的工作我的網址模式:

urlpatterns = patterns('', 

    #league page 
    url(r'^league/(.+)/$', 'fantacalcio.views.league_home',name='league_home'), 
    #rosa 
    url(r'^league/(.+)/rose/$','fantacalcio.views.rose',name='rose'), 
) 

但這反而給了我這個錯誤:

ValueError at /league/1/rose/ 
invalid literal for int() with base 10: '1/rose' 

發生這種情況,因爲/league/1/rose/停在league/1/,沒有按據我瞭解,不會移動到下一個網址。我不知道爲什麼,因爲在Django文檔我能找到這個例子:

urlpatterns = patterns('', 
    url(r'^articles/2003/$', 'news.views.special_case_2003'), 
    url(r'^articles/(\d{4})/$', 'news.views.year_archive'), 
    url(r'^articles/(\d{4})/(\d{2})/$', 'news.views.month_archive'), 
    url(r'^articles/(\d{4})/(\d{2})/(\d+)/$', 'news.views.article_detail'), 
) 

我缺少什麼?

回答

1

因爲圖案(.+)匹配1/rose。你並不是僅限於字母數字字符,所以它抓住了一切。

您已經知道交換正則表達式的順序。但是無論如何,你可能都想限制它的匹配。如果你只希望數字ID,這樣效果會更好:

'^league/(\d+)/$' 

,或者你可以匹配的字母數字字符:

'^league/(\w+)/$' 

,甚至一切,除了斜線:

'^league/([^/]+)/$'