1

我在这里迷路了。我对 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 请求。任何帮助表示赞赏!再次,如果这是一个新手问题,我很抱歉

4

2 回答 2

2

您还没有完成第二个 url 中的正则表达式字符串

url(r'^foos/new$', 'create_view')

所以 ”。” 将使用当前 url 发布表单。Django 获取 url '/foos/new' 并将其与正则表达式匹配。它匹配第一个正则表达式,因为它找到了“foos”的匹配项,所以转到“list_view”。只需正确完成您的正则表达式,它就会起作用。

url(r'^foos/new/$', 'create_view')
于 2013-08-29T01:34:33.050 回答
1

将表单操作保留为“”以发布到相同的 url,而不是使用 .

所以在这种情况下

    <form action="" method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <input type="submit" value="Confirm/>
    </form>
于 2013-08-29T00:03:32.510 回答