我要做的是在form.is_valid()
和form.save()
之后为视图中的字段添加错误,它似乎有效但只是因为黑客,而我我希望有人可以解释它为什么会起作用。
因此,在我的表单的save()
函数中,我连接到LDAP服务器,并尝试验证表单中提供的用户和密码。如果一切正常,最终会发生的是User
对象,并创建一个Profile
对象。但是,在连接到LDAP并从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())
现在,当该print语句被注释掉时,当我尝试将错误添加到表单时,我得到'NoneType' object does not support item assignment
。如果我取消注释print语句,它就像我期望的那样工作。任何想法为什么?无论如何,我可以在没有那个打印声明的情况下做到这一点?谢谢!
PS:我不想在clean方法中进行表单验证,因为我不想绑定到LDAP服务器并尝试对用户进行两次身份验证,我只想让它发生一次,它要么有效还是无效。
答案 0 :(得分:3)
form._errors
不存在。通过调用print form
,您隐式为新的表单实例调用form.is_valid()
。
提出了一个问题,为什么要创建一个新的表单实例?我会注释掉form = form_class(request.POST)
行并使用您现有的表单。