Django form.is_valid() всегда false

Я кодирую логин. Когда я запрограммировал форму вручную, я получил ее работу.

Ниже приведен код:

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 всегда false. Я прочитал все эти посты, и насколько я могу судить, я не совершаю ошибок. Я нашел новую ошибку: -)

EDIT: я добавил в код печать. Вывод при открытии входа и представления входа

[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 пуст.

Ответ 1

Оказывается, Maxime был прав в конце концов (извините) - вам нужен параметр data:

form = AuthenticationForm(data=request.POST)

Причиной этого является то, что AuthenticationForm перезаписывает подпись __init__, чтобы ожидать, что запрос будет первым позиционным параметром. Если вы явно поставьте data как kwarg, он будет работать.

(Вы все равно должны оставить предложение else, переадресовывающееся на ошибку, хотя: лучше всего позволить форме перерисовать себя с ошибками в этом случае.)

Ответ 2

посмотрите форму form.errors, которая вы узнаете, почему.