2016-12-14 41 views
0

有很多關於Django和該reverse()方法的文檔。我似乎無法找到我確切的問題。假設我有兩個的URLconf像這樣:Django的不顯示正確的URL後扭轉

url(r'ParentLists/$', main_page, name = "main_page"), 
url(r'ParentLists/(?P<grade_level>.+)/$', foo, name = "foo") 

和兩個對應的觀點是這樣的:

def main_page(request): 

    if request.method == 'POST': 
     grade_level = request.POST['grade_picked'] 
     return HttpResponseRedirect(reverse('foo', args = (grade_level,))) 

    else: 
     return render(request, 'index.html', context = {'grade_list' : grade_list}) 

def foo(request, grade_level): 

    grade_level = request.POST['grade_picked'] 

    parent_list = # get stuff from database 
    emails  = # get stuff from database 

    return render(request, 'list.html', context = {'grade_list' : grade_list, 'parent_list' : parent_list}) 

這裏,list.html只是伸出我的基本模板index.html,其中包含一個下拉框級水平。當用戶進入/ParentLists,則main_page視圖呈現的index.html與下拉框中,因爲它應該。

當用戶挑選從下拉框中選擇一個年級水平(比如5年級),此範本的表單提交,並main_page再次執行 - 但這次郵局支局運行和HttpResponseRedirect將用戶帶到/ParentLists/05。這隻會導致在下拉框下面顯示屬於5級的HTML表格。

的問題是,當用戶選擇現在說的10年級,表更新,以顯示10級的內容,但顯示的URL仍然是/ParentLists/05。我想這是/ParentLists/10

顯然,第一個選擇之後,main_page視圖不會再執行。只有foo做...等HttpResponseRedirect不會被調用。我應該如何重組這個來獲得我正在尋找的東西?提前致謝!

回答

1

正如您正確提到的,您將永遠不會從foo()重定向到foo()。

所以,簡單的方法來解決這個問題是類似的代碼添加在main_page()視圖:

def foo(request, grade_level): 

    if request.method == 'POST': 
     grade_level = request.POST['grade_picked'] 
     return HttpResponseRedirect(reverse('foo', args = (grade_level,))) 
    else: 
     parent_list = # get stuff from database 
     emails  = # get stuff from database 

     return render(request, 'list.html', context = {'grade_list' : grade_list, 'parent_list' : parent_list}) 

請注意,我刪除grade_level = request.POST['grade_picked']因爲Nagkumar阿爾卡爾古德正確地說,這是過分。

而且代替的HttpResponseRedirect組合reverse您可以使用快捷redirect這可能不大容易代碼:

from django.shortcuts redirect 
... 
return redirect('foo', grade_level=grade_level) 
+0

非常感謝你們兩位。我今天下午再看一遍,看看你的建議是否有幫助! –

+0

很好地工作,非常感謝!歡迎您 –

+0

@PatJones! – neverwalkaloner

0

我建議你使用kwargs而不是args。 使用的視圖正確的做法是:

your_url = reverse("<view_name>", kwargs={"<key>": "<value>"}) 

例:

return HttpResponseRedirect(reverse('foo', kwargs={"grade_level": grade_level})) 

此外,您使用的URL,而不是一個POST值發送 「grade_level」 到您的視圖FOO。我會刪除行:

grade_level = request.POST['grade_picked'] 

,你將覆蓋發送到URL中的方法grade_level。