0

我想要做的是在视图中添加一个错误,在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())

现在,在注释掉该打印语句后,'NoneType' object does not support item assignment当我尝试将错误添加到表单时,我得到了一个。如果我取消注释打印语句,它会像我期望的那样工作。关于为什么的任何想法?无论如何,我可以在没有打印语句的情况下做到这一点?谢谢!

PS:我不想在 clean 方法中进行表单验证,因为我不想绑定到 LDAP 服务器并尝试对用户进行两次身份验证,我只希望它发生一次,它要么工作要么不不。

4

1 回答 1

3

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

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

于 2010-07-23T04:13:45.717 回答