我正在编写登录信息。当我手工编写表格时,我开始工作了。
以下代码有效:
views.py
def login_view(request):
if request.method == 'GET':
return render(request, 'app/login.htm')
if request.method == 'POST':
username = request.POST.get('username', '')
password = request.POST.get('password', '')
user = auth.authenticate(username=username, password=password)
if user is None:
return HttpResponseRedirect(reverse('error'))
if not user.is_active:
return HttpResponseRedirect(reverse('error'))
# Correct password, and the user is marked "active"
auth.login(request, user)
# Redirect to a success page.
return HttpResponseRedirect(reverse('home'))
模板:
<form method="post" action="{% url 'login' %}">
{% csrf_token %}
<p><label for="id_username">Username:</label> <input id="id_username" type="text" name="username" maxlength="30" /></p>
<p><label for="id_password">Password:</label> <input type="password" name="password" id="id_password" /></p>
<input type="submit" value="Log in" />
<input type="hidden" name="next" value="" />
</form>
大!但现在我想用Django的形式做同样的事情。
下面的代码无效,因为我总是得到is_valid()== False。
views.py:
def login_view(request):
if request.method == 'POST':
form = AuthenticationForm(request.POST)
print form.is_valid(), form.errors, type(form.errors)
if form.is_valid():
## some code....
return HttpResponseRedirect(reverse('home'))
else:
return HttpResponseRedirect(reverse('error'))
else:
form = AuthenticationForm()
return render(request, 'app/login.htm', {'form':form})
模板:
<form action="{% url 'login' %}" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" />
stackoverflow上有很多人抱怨他们得到is_valid总是假的。我已经阅读了所有这些帖子,据我所知,我没有犯这些错误。我发现了一个新的错误: - )
编辑:我在代码中添加了一个打印件。打开登录视图并提交时的输出是[27/Dec/2013 14:01:35] "GET /app/login/ HTTP/1.1" 200 910
False <class 'django.forms.util.ErrorDict'>
[27/Dec/2013 14:01:38] "POST /app/login/ HTTP/1.1" 200 910
所以is_valid()为False,但form.errors为空。
答案 0 :(得分:16)
事实证明Maxime是对的(对不起) - 你确实需要data
参数:
form = AuthenticationForm(data=request.POST)
然而,原因在于AuthenticationForm会覆盖__init__
的签名,以期望请求作为第一个位置参数。如果您明确提供data
作为kwarg,它将起作用。
(你仍然应该忽略重定向错误的else子句:在这种情况下,最好让表单重新呈现自己的错误。)
答案 1 :(得分:8)
查看form.errors,你会发现原因。