2

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

视图.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))

注册.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 启动的表单对象。我在这里缺少什么吗?

非常感谢任何提示。

编辑:感谢克雷格和伊格纳西奥的提示。但是,我的问题是,无论我对这个表单做什么,无论是 GET 还是 POST,在表单中使用 GET 总是会给我关于“必填字段”的表单错误。这就是我不理解的机制。对此的任何帮助将不胜感激,谢谢。

4

3 回答 3

2

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

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

于 2011-05-19T17:50:49.980 回答
1

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

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

    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 %} 。

于 2011-05-18T15:35:36.180 回答
0

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

于 2011-05-18T15:13:37.603 回答