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.