数据当用户在验证失败(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)时被重定向回表单时如何保留表单?的主要内容,如果未能解决你的问题,请参考以下文章