Django form.is_valid()总是假的

one*_*oop 15 python forms django

我正在编写登录信息.当我手动编写表格时,我得到了它的工作.

以下代码有效:

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'))
Run Code Online (Sandbox Code Playgroud)

模板:

<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>
Run Code Online (Sandbox Code Playgroud)

大!但现在我想用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})
Run Code Online (Sandbox Code Playgroud)

模板:

<form action="{% url 'login' %}" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" />
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

因此is_valid()为False,但form.errors为空.

Dan*_*man 17

事实证明Maxime是对的(对不起) - 你确实需要data参数:

form = AuthenticationForm(data=request.POST)
Run Code Online (Sandbox Code Playgroud)

这样做的原因是AuthenticationForm会覆盖签名,__init__以期望请求作为第一个位置参数.如果您明确地提供data作为kwarg,它将起作用.

(尽管如此,你仍然应该省略重定向错误的else子句:在这种情况下,最好让表单重新呈现自己的错误.)

  • 你知道,现在我经常去阅读源代码...... :-) 已经快 3 年了。天啊。 (2认同)

Zhu*_*o.M 8

检查form.errors你会发现原因.