数据当用户在验证失败(Python,Django)时被重定向回表单时如何保留表单?

Posted

技术标签:

【中文标题】数据当用户在验证失败(Python,Django)时被重定向回表单时如何保留表单?【英文标题】:data How to keep form when user gets redirected back to the form when they fail a validation (Python, Django)? 【发布时间】:2017-10-03 23:35:23 【问题描述】:

我知道这可能是一个重复的问题,但前一个问题是一个较旧的问题,这些问题使用了一个对我没有真正帮助的表单实例。

验证失败后如何保留表单数据?我有多个下拉菜单和输入字段,我讨厌看到我的用户在后端验证失败时重新做和重新输入所有内容。假设我有这个非常简单的形式:

html

  <form class="" action="/register" method="post">
      <label for="">First Name</label>
      <input type="text" name="" value="">

      <label for="">Last Name</label>
      <input type="text" name="" value="">

      <label for="">Password</label>
      <input type="password" name="" value="">
    </form>

views.py:

def register(self):

    .....
    if errors:
        for err in errors
            messages.errors(request, err)
            return redirect('/')
    else:
        messages.success(request, "Welcome User!")
        return redirect('/dashboard')

我遇到的大多数示例都使用了使用 form.save() 等的表单实例。我选择不使用那个。如果验证失败,有没有办法用用户提交的数据自动填充我的表单?谢谢!

【问题讨论】:

【参考方案1】:

Django 表单类是要走的路。表单验证和渲染是他们构建的任务。我会强烈推荐使用它们,因为在将用户输入传回浏览器时,它们还负责安全方面(所有来自用户空间的输入都是邪恶的!)。

如果您确实需要在没有表单类的情况下实现此目的,则需要手动将表单值添加到呈现上下文中 - 这允许您在模板中使用它们。

您的方法的主要问题是,您希望在出现验证错误时重定向。重定向是对浏览器的响应,它告诉您:我没有给您,请转到此位置。通常浏览器不会将第一个请求中发送的数据也发送到第二个请求(这通常是一个好的行为)。您可以通过使用状态码 307 而不是 302 来解决此问题。阅读例如Response.Redirect with POST instead of Get? 了解更多信息。或者,您可以使用 get 参数将表单数据编码到目标位置。

再次重申:您应该有一个很好的理由,不要只使用一种视图的 django 方法,该方法作用于 GET 和 POST 不同,并使用表单实例正确处理表单。

【讨论】:

以上是关于数据当用户在验证失败(Python,Django)时被重定向回表单时如何保留表单?的主要内容,如果未能解决你的问题,请参考以下文章

Django - 403 禁止 CSRF 验证失败

CSRF 验证失败 - 当主机安全时,Referer 不安全

Django 管理员身份验证失败

Django/python 验证 JSON

注销时 Django CSRF 验证失败

django在验证登录页面时遇到的数据查询问题