【问题标题】:Django: Form GET has "field required" errors while POST doesn'tDjango:表单 GET 有“必填字段”错误,而 POST 没有
【发布时间】:2011-08-28 04:02:03
【问题描述】:

在 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))

注册.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 总是会给我关于“必填字段”的表单错误。这就是我不理解的机制。对此的任何帮助将不胜感激,谢谢。

【问题讨论】:

    标签: django forms post get required


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      首先,如果您使用登录,则在登录用户时应始终使用 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 %}。

      【讨论】:

      • form = RegisterForm (request) 应该是 form = RegisterForm (request.POST),但这对于编辑来说太短了。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-30
        • 2020-10-15
        • 2020-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多