2010-07-23 77 views
0

我想要做的就是添加一个错误的字段在视图中,既form.is_valid()form.save()后,它似乎工作,但只是一个黑客,因为,我希望这里有人能解释为什么它作品。在视图中添加一个Django窗体的错误...破解?

所以在我的窗体的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当我尝试错误添加到窗体。如果我取消打印声明的注释,它就像我期望的那样工作。任何想法为什么?无论如何,我可以做到这一点,而没有在那里的打印声明?谢谢!

PS:我不想做表单验证的清洁方法,因为我不希望有绑定到LDAP服务器,并尝试两次验证用户身份,我只是希望它一旦发生,且无论是工作还是没有。

回答

3

form._errors不存在,直到验证发生。通过调用print form,您隐式地为您的新表单实例调用form.is_valid()

这就提出了一个问题,你为什么要创建一个新的表单实例?我会注释掉form = form_class(request.POST)行并使用您现有的表单。

+0

好问题..它晚了,我累了,整天我一直在此。这是我最好的答案:P 但是,谢谢,这效果更好。 – hora 2010-07-23 04:28:18