我迷失在这里。我对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'),
)
当我输入网址“localhost:8000 / foos / new”时,create视图会按预期获取GET请求。问题是,在提交表单后,我被重定向到列表(使用调试器,我发现请求进入list_view),即使表单操作设置为“。” 我究竟做错了什么? create_view视图应该接收POST请求。 任何帮助表示赞赏!再次,如果这是一个新手问题,我很抱歉
答案 0 :(得分:2)
您尚未在第二个网址
中完成正则表达式字符串url(r'^foos/new$', 'create_view')
所以“。”将使用当前URL来POST表单。 Django将url'/ foos / new'与正则表达式进行匹配。它匹配第一个正则表达式,因为它找到了'foos'的匹配,所以转到'list_view'。只要正确完成正则表达式就可以了。
url(r'^foos/new/$', 'create_view')
答案 1 :(得分:1)
将表单操作保留为“”以发布到相同的网址而不是使用。
所以在这种情况下
<form action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Confirm/>
</form>