2016-12-14 8 views
0

Djangoとreverse()メソッドに関するドキュメントはたくさんあります。私は私の正確な問題を見つけることができない。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を拡張私はこのような2 URLconfのがあるとします。ユーザーが/ParentListsに行くと、main_pageビューはドロップダウンボックスでindex.htmlをレンダリングします。

ユーザーがドロップダウンボックスから学年を選ぶ(5年生と言う)、テンプレートはフォームは提出しない、とmain_pageは再び実行 - 今回POSTブランチが実行され、HttpResponseRedirectにユーザーを取ります/ ParentLists/05。これにより、ドロップダウンボックスの下にグレード5に関するHTMLテーブルが表示されます。

問題は、ユーザーが10th Gradeを選択すると、表はグレード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}) 

はNagkumar Arkalgudが正しくそれが過度であると私は理由grade_level = request.POST['grade_picked']を削除することに注意してください。

また代わりのHttpResponseRedirectの組み合わせとreverseショートカットredirectを使用することができ、コードにおそらく少し簡単:

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

おかげで、あなたの両方にそんなに。私は今日の午後にそれをもう一度見て、あなたの提案が助けになるかどうかを見てみましょう! –

+0

うまく動作します、ありがとう! –

+0

@PatJonesようこそ! – neverwalkaloner

0

argsの代わりにkwargsを使用することをお勧めします。ビューを使用する 正しい方法は次のとおりです。

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

例:

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

また、あなたがURLではなくPOST値を使用して、ビューのfooへの "grade_level" を送っています。

URLからメソッドに送信されたgrade_levelを上書きするので、私はこの行を削除します。

関連する問題