Django:表单GET有“字段必需”错误而POST没有

时间:2011-05-18 15:11:54

标签: django forms post get required

使用表单在Django中编码。我有一个问题,如果表单是GET,那么每个字段总是出现错误“此字段是必需的。”,但如果表单是POST,则问题不存在。这是一个简单的例子(部分代码),

views.py:

def login(request):        
    if request.method == 'GET':
        form = RegisterForm (request.GET)
    else:
        form = RegisterForm ()
return render_to_response('register.html', locals(), context_instance=RequestContext(request))

register.html:

<form action = "" method = "GET">
    <table style = "border: none;">
        <tr>
            <td class = "login"><strong>email:</strong></td>
            <td class = "login">{{ form.email }}</td>
            <td><span class = "error">{{ form.errors.email }}</span></td>
        </tr>

        ...
    </table>
</form>

如果你将所有'GET'改为'POST',一切都很好。否则'form.errors.email'将始终抛出“此字段是必需的”。错误。

另一个奇怪的事情......似乎我看不到任何使用request.GET启动的表单对象。 Django Book 2.0仅显示使用request.POST启动的表单对象。这里有什么我想念的吗?

非常感谢任何提示。

编辑:感谢Craig和Ignacio的提示。但是,我的问题是,不管我正在使用这个表单,无论是GET还是POST,在表单中使用GET总是给我关于“字段必需”的表单错误。那是我不理解的机制。任何帮助都将非常感谢,谢谢。

3 个答案:

答案 0 :(得分:2)

如果我没弄错,默认的HTTP请求方法总是GET,除非它被指定为POST。因此,当您访问该视图时(默认使用GET),您已经满足if request.method == 'GET':语句,因此它会自动调出验证错误,以便将空数据插入到字段中。你永远不会真正到达else: form = RegisterForm()

查看django-debug-toolbar这是一个非常有用的工具栏,它允许您查看请求类型和请求变量。

答案 1 :(得分:1)

首先,如果您使用登录,则在登录用户时应始终使用帖子。

其次,您要在一个地方初始化一个空表单,而不是在另一个地方。你可能想要的是:

    def login(request):        
        if request.method == 'POST':
             form = RegisterForm (request.POST)
             # Some logic to validate the user
        else:
             form = RegisterForm ()
             return render_to_response('register.html', locals(), context_instance=RequestContext(request))

如果您要发布到同一页面,则不需要您的操作值。此外,如果您正在使用POST(如您所愿),那么您应该在表单中使用{%csrf_token%}。

答案 2 :(得分:0)

省略action属性。默认情况下,提交是相同的URL(当然,除非使用GET)。