【问题标题】:Adding an error to a django form in a view... hack?在视图中向 django 表单添加错误... hack?
【发布时间】:2010-07-23 03:51:54
【问题描述】:

我要做的是在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 服务器并尝试对用户进行两次身份验证,我只希望它发生一次并且它要么工作或不工作。

【问题讨论】:

    标签: django ldap django-forms django-validation


    【解决方案1】:

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

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

    【讨论】:

    • 好问题.. 很晚了,我累了,我整天都在做这个。这是我最好的答案:P 但是谢谢,这样效果更好。
    猜你喜欢
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 2014-09-06
    • 2012-07-21
    • 1970-01-01
    相关资源
    最近更新 更多