您的位置:

提示ValidationError([ValidationError("Non-field error 2.")])的解决方案

  发布时间:2023-03-30 20:12:10
报错的原因Django的`ValidationError`是在模型层面进行验证时抛出的一个异常,当出现时,通常是因为你在你的模型验证代码中抛出了一个这样的异常。在抛出 `ValidationError` 异常时,提供一个可选的字段参数,指明错误所在的字段。例如使用Django forms来验证数据并处理验证错误, Form自带field level验证和form level验证 你也可以在验证之前,使用print调试你的代码,确认你的数据是否是正确的, 如果数据不正确可以在数据清洗之前进行检查。

报错的原因

Django的`ValidationError`是在模型层面进行验证时抛出的一个异常,当出现 `ValidationError([ValidationError("Non-field error 2.")])`时,通常是因为你在你的模型验证代码中抛出了一个这样的异常。错误消息 "Non-field error 2." 一般是指你的验证代码发现了一个错误,但无法确定这个错误属于哪个字段,因此将错误消息定位为 "Non-field error"。

建议你细看你的验证代码,找出发生错误的地方,更正错误并重试。如果还是不能解决问题,也可以提供你的验证代码,我会尽力帮你解决问题。

如何解决

解决这个问题的方法有以下几种:

1. 检查你的验证代码,找出抛出了 `ValidationError("Non-field error 2.")` 的地方,确定问题所在并修正。

2. 在抛出 `ValidationError` 异常时,提供一个可选的字段参数,指明错误所在的字段。例如:


raise ValidationError("This field is required.", code='required', params={'field': 'field_name'})

3. 使用Django forms来验证数据并处理验证错误, Form自带field level验证和form level验证

4. 你也可以在验证之前,使用print调试你的代码,确认你的数据是否是正确的, 如果数据不正确可以在数据清洗之前进行检查。

使用例子

是的,有一些例子来演示如何使用方法2和方法3来解决问题:

例1. 方法2:


class MyModel(models.Model):
    field1 = models.CharField(...)
    field2 = models.IntegerField(...)
    ...
    def clean(self):
        if self.field1 == 'foo' and self.field2 > 10:
            raise ValidationError("field1 can't be 'foo' if field2 > 10.", code='invalid', params={'field1': self.field1, 'field2': self.field2})

例2. 方法3


from django import forms
class MyForm(forms.Form):
    field1 = forms.CharField(...)
    field2 = forms.IntegerField(...)
    ...
    def clean(self):
        cleaned_data = super().clean()
        field1 = cleaned_data.get("field1")
        field2 = cleaned_data.get("field2")
        if field1 == 'foo' and field2 > 10:
            raise forms.ValidationError("field1 can't be 'foo' if field2 > 10.")

注意:Form中的验证会在 is_valid() 中进行调用,而模型的验证在save()中进行。

这只是一些简单的例子,请根据你的代码进行修改使其适用你的需求。如果你有其他问题,请随时问我。