Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将错误消息附加到django中的form.non_field_errors?_Python_Django_Django Forms - Fatal编程技术网

Python 如何将错误消息附加到django中的form.non_field_errors?

Python 如何将错误消息附加到django中的form.non_field_errors?,python,django,django-forms,Python,Django,Django Forms,我有一个有几个字段的表单。我通过表单验证对每个字段进行单独的验证检查。但是,在将用户重定向到其他视图之前,我还需要检查是否填写了几个字段。我希望我能以某种方式将错误附加到forms.non_field_errors,因为它不适用于特定字段,但我不确定正确的语法是什么。我在网上查了一下,发现 form.errors['__all__'] = form.error_class(["error msg"]) 这会显示错误消息,但它似乎也会弄乱其他页面,如果单击其他任何内容,则会显示错误消息 我试过了

我有一个有几个字段的表单。我通过表单验证对每个字段进行单独的验证检查。但是,在将用户重定向到其他视图之前,我还需要检查是否填写了几个字段。我希望我能以某种方式将错误附加到forms.non_field_errors,因为它不适用于特定字段,但我不确定正确的语法是什么。我在网上查了一下,发现

form.errors['__all__'] = form.error_class(["error msg"])
这会显示错误消息,但它似乎也会弄乱其他页面,如果单击其他任何内容,则会显示错误消息

我试过了

form._errors[NON_FIELD_ERRORS] = form.error_class()
这会导致“非类型”对象没有属性“setdefault”错误

我试过了

form.non_field_errors().append("Please complete your profile in order to access the content.")
这似乎没有任何作用,我看不到视图上的错误消息

最好的方法是什么?理想情况下,我不想用表单的干净方法来做。我觉得我应该能够在视图中的表单中附加一个错误

  • 调用full\u clean(),这应该初始化
    表单。\u错误
    。这一步很关键,如果你不这样做,它就不会起作用

  • 创建错误列表,它获取一个消息列表,将其实例化为:
    error\u list=form.error\u class(['your error messages'))

  • 将错误列表分配给非字段错误,您必须从
    django.forms.forms
    导入
    非字段错误
    ,然后这样分配:
    form.\u错误[非字段错误]=错误列表

  • 下面是一个来自shell的演示:

    In [1]: from bet.forms import BetForm
    
    In [2]: from django.forms.forms import NON_FIELD_ERRORS
    
    In [3]: form = BetForm()
    
    In [4]: form.full_clean()
    
    In [5]: form._errors[NON_FIELD_ERRORS] = form.error_class(['your error messages'])
    
    In [6]: form.non_field_errors()
    Out[6]: [u'your error messages']
    

    这有点过时,但我最近遇到了同样的问题,我想为未来的读者进一步阐明这一点

  • 从Django 1.6+开始,错误字典存储为form.errors,而不是form.\u errors
  • 如果实例化form.is_valid(),它相当于运行full_clean()
  • 非字段错误不需要导入,您只需参考其默认字典键
    \uuuuu all\uuuu
  • 例如:

    if form.is_valid():
        form.errors['__all__'] = form.error_class(['Your Error Here!'])
    

    self.\u errors.setdefault(“\uu all”\uuuu',ErrorList()).extend([“”])

    我知道我可以用Form.clean()方法完成。不过,我更愿意在视图中执行此操作,只需在form.errors列表中添加一个错误,这可能吗?是的,这可能是我的答案证明的:)感谢jpic提供详细的答案。我将试用此代码并返回。很抱歉回复太晚,我已经外出度假了。请参考其他人的回答:这在Django 1.5中运行良好。最初的问题是关于在列表中添加错误(而不是完全替换列表)。提交人在对这一问题的第一次答复中进一步重申了这一点,显然被忽视了。这个答案实际上根本不能解决这个问题,因为它会在表单上覆盖所有现有的非字段错误时将其从表单中删除。一般来说,最好使用定义的常量,即
    非字段错误
    覆盖其值
    \uuuuuuuuu
    。另外,据我所知,在调用
    is\u valid()
    之前设置非字段错误的目的是能够实际影响
    is\u valid()
    的结果。我同意非字段错误常量部分,我只想指出一个替代方法。至于设置非字段错误,我想说的是,除非调用is\u valid()或full\u clean(),否则不会实例化非字段错误。如果您在运行任何一种方法之前尝试登录,您将得到一个KeyError。除非您想说的是在运行is\u valid()之前应该运行full\u clean()?这充满了错误信息:form.errors是访问内部列表表单的属性。\u errors。使用非字段错误作为常量是一种很好的做法,因为有一天开发人员可能会突然决定该常量应该与字符串“la_le_loo”等效。这就是为什么我们在语言中有常量——这样我们可以更容易地抽象和维护代码。此外,form.is_valid()并不等同于运行full_clean()。is_valid()调用form.errors,它调用full_clean来填充_errors字典。