有很多关于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
永远不会被调用。我应该如何重组这个以获得我正在寻找的东西?提前谢谢!
答案 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正确地说它过分了。
而不是HttpResponseRedirect
和reverse
的组合,您可以使用快捷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。