Django反转后没有显示正确的URL

时间:2016-12-14 02:48:32

标签: django urlconf

有很多关于Django和reverse()方法的文档。我似乎无法找到我的确切问题。假设我有两个这样的urlconf:

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 - 但这次POST分支运行并且{{1将用户带到 / ParentLists / 05 。这只会导致在下拉框下方显示与5级相关的HTML表格。

问题是,当用户现在选择说10年级时,表格会更新以显示10年级内容,但显示的网址仍为 / ParentLists / 05 。我希望它是 / ParentLists / 10

显然,在第一次选择之后,HttpResponseRedirect视图永远不会再次执行。只有main_page会...而且foo永远不会被调用。我应该如何重组这个以获得我正在寻找的东西?提前谢谢!

2 个答案:

答案 0 :(得分:2)

正如你正确提到的那样,你永远不会从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 Arkalgud正确地说它过分了。

而不是HttpResponseRedirectreverse的组合,您可以使用快捷redirect,这可能很难编码:

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

答案 1 :(得分:0)

我建议你使用kwargs而不是args。 使用该视图的正确方法是:

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

例如:

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

此外,您使用URL而不是POST值向视图foo发送“grade_level”。我会删除该行:

grade_level = request.POST['grade_picked']

因为您将覆盖从网址发送到方法的grade_level。