2014-10-28 55 views
0

我在反向查找時遇到了一些奇怪的問題。這是我的網址方案。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+)$'] 
+0

添加'$'定位點時會出現什麼問題? – 2014-10-28 17:26:58

+0

我可以添加'$'錨點,但是如果我指定了一個名稱,是不是應該直接跳到該方案? – 2014-10-28 17:29:45

+3

問題是,如果沒有'$'定位點,您的第一條規則始終匹配,因爲所有這些URL都以* overview/*開頭。因此你需要用'$'錨點標記字符串的結尾。 – 2014-10-28 17:34:45

回答

0

看起來你要使用你的urlconf接受郵件你想發送給用戶。例如您的錯誤信息

return redirect('overview_error', error='Login failed. Please try your username/password again') 

然而,這不是什麼叫在urlconf組對。它們用於匹配url模式以確定要呈現哪個視圖。所以當你打電話給redirect時,它不只是發送給你一個新的url,它是根據你傳遞的信息來解析這個url。

在你的第二個例子你redirect通話

return redirect("overview_success", tutorial='', success="Hooray") 

試圖來匹配您的URL模式

url(r'^overview/(?P<tutorial>\w+)/(?P<success>\w+)$', 'ledger.views.overview', name='overview_success'), 

,就像這樣overview//Hooray正如你可以看到是不是因爲一個有效的模式空字符串傳遞給tutorial,它需要1個或多個「單詞」字符。

您可以使用消息傳遞框架將消息發送給用戶。 https://docs.djangoproject.com/en/1.7/ref/contrib/messages/#module-django.contrib.messages