我在反向查找時遇到了一些奇怪的問題。這是我的網址方案。Django url模式具有可選參數的反向查詢問題
url(r'^overview/', 'ledger.views.overview', name='overview'),
url(r'^overview/(?P<tutorial>\w+)$', 'ledger.views.overview', name='overview_tutorial'),
當我打電話return redirect('overview_tutorial', tutorial='tutorial')
它不加載教程版本,它加載的是普通版,這是怪我。我想通過指定網址的名稱,它會使用該網址,但它是匹配的第一個網址。添加$
到URL方案的最終解決了這個問題:
url(r'^overview/$', 'ledger.views.overview', name='overview'),
url(r'^overview/(?P<tutorial>\w+)$', 'ledger.views.overview', name='overview_tutorial'),
,但我還是不明白爲什麼它是這樣做的。我真正想要做的是有這樣一個URL方案:
url(r'^overview/', 'ledger.views.overview', name='overview'),
url(r'^overview/(?P<tutorial>\w+)$', 'ledger.views.overview', name='overview_tutorial'),
url(r'^overview/(?P<success>\w+)$', 'ledger.views.overview', name='overview_success'),
url(r'^overview/(?P<error>\w+)$', 'ledger.views.overview', name='overview_error')
,然後我可以重定向到相應的適當的URL名稱,並通過在不同的參數。即:
return redirect('overview_success', success='True') #or
return redirect('overview_error', error='Login failed. Please try your username/password again')
但這些都返回,就好像我只是叫教程視圖。 (我現在意識到是因爲反向URL查找必須構建url,然後通過url模式運行它以查看它應該指向的位置)。
於是我試着這樣做:
url(r'^overview/(?P<tutorial>\w+)$', 'ledger.views.overview', name='overview'),
url(r'^overview/(?P<tutorial>\w+)/(?P<success>\w+)$', 'ledger.views.overview', name='overview_success'),
url(r'^overview/(?P<tutorial>\w+)/(?P<success>\w+)/(?P<error>\w+)$', 'ledger.views.overview', name='overview_error'),
,但是當我打電話return redirect("overview_success", tutorial='', success="Hooray")
,我又得到一個錯誤:
Reverse for 'overview_success' with arguments '()' and keyword arguments '{'success': 'Hooray', 'tutorial': ''}' not found. 1 pattern(s) tried: ['overview/(?P<tutorial>\\w+)/(?P<success>\\w+)$']
添加'$'定位點時會出現什麼問題? – 2014-10-28 17:26:58
我可以添加'$'錨點,但是如果我指定了一個名稱,是不是應該直接跳到該方案? – 2014-10-28 17:29:45
問題是,如果沒有'$'定位點,您的第一條規則始終匹配,因爲所有這些URL都以* overview/*開頭。因此你需要用'$'錨點標記字符串的結尾。 – 2014-10-28 17:34:45