提示ValidationError([ValidationError("Non-field error 2.")])的解决方案
报错的原因
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()中进行。
这只是一些简单的例子,请根据你的代码进行修改使其适用你的需求。如果你有其他问题,请随时问我。