Добавление ошибки в форму Django в представлении ... взломать? - PullRequest
0 голосов
/ 23 июля 2010

То, что я пытаюсь сделать, это добавить ошибку для поля в представлении, ПОСЛЕ и form.is_valid() и form.save(), и, похоже, это работает, но только из-за взлома, и я надеюсь, что кто-тоЗдесь можно объяснить, почему это работает.

Так что в функции save() моей формы я подключаюсь к серверу LDAP и пытаюсь аутентифицировать пользователя и пароль, предоставленные в форме.Если все это работает, то в итоге получается объект User и создается объект Profile.Однако в коде для подключения и получения данных из LDAP существует вероятность возникновения ошибки, например, неправильных учетных данных или просто невозможно привязать к серверу.В таком случае я возвращаю None, и мое представление обрабатывает его, добавляя в форму ошибку.Вот соответствующий код в представлении:

if form.is_valid():
    profile = form.save()
    if profile is None:
        # there was an LDAP error
        msg = u"An error ocurred trying to authenticate over LDAP. Try again."
        form = form_class(request.POST)
        print form
        form._errors['user_name'] = ErrorList([msg])

        return render_to_response(template_name, locals())

Теперь, когда этот оператор печати закомментирован, я получаю 'NoneType' object does not support item assignment, когда пытаюсь добавить ошибку в форму.Если я раскомментирую оператор print, он будет работать так, как я ожидал.Есть идеи, почему?И в любом случае я могу сделать это, не имея там этого оператора печати?Спасибо!

PS: я не хотел делать проверку формы в чистом методе, так как я не хочу привязываться к серверу LDAP и пытаться аутентифицировать пользователя дважды, я просто хочу, чтобыслучается один раз, и это либо работает, либо нет.

1 Ответ

3 голосов
/ 23 июля 2010

form._errors не существует, пока не произойдет проверка.Вызывая print form, вы неявно вызываете form.is_valid() для своего нового экземпляра формы.

Что поднимает вопрос, почему вы создаете новый экземпляр формы?Я бы закомментировал строку form = form_class(request.POST) и использовал вашу существующую форму.

...