Проблема иерархии форм в Джанго - PullRequest
1 голос
/ 25 июля 2011

Я создал форму для входа в систему, вот так:

class LoginForm(AuthenticationForm):
    username = forms.CharField (label=_("Usuario"), max_length=30, 
                widget=forms.widgets.
                TextInput(attrs={'id':'username','maxlength':'25'}))
    password = forms.CharField (label=_("Password"), widget=forms.widgets.
                PasswordInput(attrs={'id':'password','maxlength':'10'}))

Я использую ее в этом представлении:

def login(request):
    if request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
                ...

После отладки я понимаю, что form.is_valid ()метод возвращает ложь, потому что атрибут is_bound является ложным.Должен ли я переопределить что-то в моей форме или изменить свое представление ???

Редактировать 1

Я следил за этим SO вопросом о том, что метод is_valid () возвращает False: form.is_valid () всегда возвращает false

, но проблема все еще существует.

Ответы [ 2 ]

1 голос
/ 23 декабря 2011

Один вопрос о принятом на данный момент ответе:

form = LoginForm(request=request, data=request.POST)

означает, что передача запроса, по-видимому, позволяет Django проверять, был ли тестовый cookie успешным перед началом сеанса. Проблема заключается в том, что если вы не установили тестовый файл cookie ранее (он должен быть задан в предыдущем запросе на просмотр), он потерпит неудачу и ваш логин не удастся. Я рекомендую просто передать аргумент ключевого слова данных следующим образом:

form = LoginForm(data=request.POST)

Если я не пропустил что-то важное (не похоже, что проверка файлов cookie абсолютно необходима), это работает лучше в большинстве ситуаций. В качестве альтернативы вы можете вызвать request.set_test_cookie () в представлении, которое загружает страницу входа, но это не охватывает все сценарии.

0 голосов
/ 25 июля 2011

Проблема на самом деле похожа на ту, на которую вы ссылаетесь. Форма, от которой вы наследуете django.contrib.auth.forms.AuthenticationForm, принимает request в качестве первого параметра перед обычным параметром data. Вот почему ваша форма сообщает о том, что она не связана - что касается ее, вы не передаете никаких данных, поэтому к ней не имеет никакого отношения.

Итак, по вашему мнению, вам нужно создать его экземпляр следующим образом:

form = LoginForm(request=request, data=request.POST)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...