当表单操作设置为“。”时,Django 重定向到不同的视图。
Posted
技术标签:
【中文标题】当表单操作设置为“。”时,Django 重定向到不同的视图。【英文标题】:Django redirects to different view when form action is set to "." 【发布时间】:2013-09-01 06:05:25 【问题描述】:我在这里迷路了。我对 django 很陌生,也许这是一个新手问题。 我有一个非常简单的列表视图,它显示了数据库中的记录和一个添加这些对象的创建视图:
@login_required
def list_view(request):
objects = Foo.objects.all()
ctx = 'objects': objects
return render_to_response('main/foos.html', ctx,
context_instance=RequestContext(request))
@login_required
def create_view(request):
if request.method == 'POST':
form = FooForm(request.POST)
if form.is_valid():
form.save()
return redirect('/foos/')
else:
form = FooForm()
ctx = 'form': form
return render_to_response('main/foo_form.html', ctx,
context_instance=RequestContext(request))
foo_form.html 模板如下所示:
<!DOCTYPE html>
<html>
<head>
<title>Club</title>
</head>
<body>
<form action="." method="post">
% csrf_token %
form.as_p
<input type="submit" value="Confirm/>
</form>
</body>
</html>
网址设置:
urlpatterns = patterns('',
url(r'^foos/$', 'list_view'),
url(r'^foos/new$', 'create_view'),
)
当我键入 url “localhost:8000/foos/new”时,创建视图会按预期获取 GET 请求。问题是,在提交表单后,我被重定向到列表(使用调试器,我发现请求正在到达 list_view),即使表单操作设置为“。” 我究竟做错了什么? create_view 视图应该接收 POST 请求。 任何帮助表示赞赏!再次,如果这是一个新手问题,我很抱歉
【问题讨论】:
【参考方案1】:你还没有完成第二个 url 中的正则表达式字符串
url(r'^foos/new$', 'create_view')
所以“。”将使用当前 url 发布表单。 Django 获取 url '/foos/new' 并将其与正则表达式匹配。它匹配第一个正则表达式,因为它找到了“foos”的匹配项,所以转到“list_view”。只需正确完成您的正则表达式,它就会起作用。
url(r'^foos/new/$', 'create_view')
【讨论】:
应该不是问题。默认情况下,末尾的斜杠由 django 放在那里。 @Games Brainiac - 不正确,Django 没有将斜杠添加到正则表达式,只有 url 本身。我的答案是正确的,很容易在我的开发环境中复制。添加尾部斜杠可以解决问题。 你能否将答案标记为正确,如果可以的话,其他人会回答这个问题。 抱歉拖了这么久【参考方案2】:将表单操作保留为“”以发布到相同的 url,而不是使用 .
所以在这种情况下
<form action="" method="post">
% csrf_token %
form.as_p
<input type="submit" value="Confirm/>
</form>
【讨论】:
成功了!!我知道这一定很愚蠢......你能向我解释一下“。”是什么意思吗?那么呢?谢谢! 老实说,我认为它应该有效,可能尝试将 foo/new url 更改为url(r'^foos/new/$', 'create_view'),
还有一个小技巧,给你的 url 添加一个名字,url(r'^foos/$', 'list_view', name='fooname'),
意味着你可以做return redirect('fooname')
所以如果你改变 /foo/ url,你不需要改变其余的你的代码匹配以上是关于当表单操作设置为“。”时,Django 重定向到不同的视图。的主要内容,如果未能解决你的问题,请参考以下文章
数据当用户在验证失败(Python,Django)时被重定向回表单时如何保留表单?