views:

19

answers:

1

What I'm trying to do is to add an error for a field in a view, AFTER both form.is_valid() and form.save(), and it seems to work but only because of a hack, and I'm hoping someone here can explain why it works.

So in my form's save() function, I connect to an LDAP server, and try to authenticate the user and password supplied in the form. If it all works, what ends up happening is a User object and a Profile object gets created. However in the code for connecting to and getting data from LDAP it's possible that an error occurs, such as wrong credentials or simply can't bind to the server. In such a case, I return None and my view then deals with it by adding an error to the form. Here's the relevant code in the view:

            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())

Now, with that print statement commented out, I get a 'NoneType' object does not support item assignment when I try to add the error to the form. If I uncomment the print statement, it works like I expect it to. Any ideas as to why? And anyway I can do this without having that print statement in there? Thanks!

PS: I didn't want to do form validation in the clean method since I don't want to have to bind to the LDAP server and try to authenticate the user twice, I just want it to happen once and it either works or doesn't.

+2  A: 

form._errors doesn't exist until validation occurs. By calling print form, you are implicitly calling form.is_valid() for your new form instance.

Which raises the question, why are you creating a new form instance? I would comment out the form = form_class(request.POST) line and use your existing form.

Wogan
Good question.. It's late, and I'm tired, and I've been at this all day. That's my best answer :PBut thanks, that works much better.
hora