使用表单在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总是给我关于“字段必需”的表单错误。那是我不理解的机制。任何帮助都将非常感谢,谢谢。答案 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)。