Python 如何检查是否引发了Django ValidationError子类?
假设我有一个Django模型:Python 如何检查是否引发了Django ValidationError子类?,python,django,python-2.7,django-1.6,Python,Django,Python 2.7,Django 1.6,假设我有一个Django模型: class MyDjangoModel(models.Model): name = models.CharField(max_length=200) attribute = models.IntegerField() class CustomValidationError(ValidationError): pass def clean(self): if self.attribute <
class MyDjangoModel(models.Model):
name = models.CharField(max_length=200)
attribute = models.IntegerField()
class CustomValidationError(ValidationError):
pass
def clean(self):
if self.attribute < 1:
raise CustomValidationError("Attribute should be > 1!")
if len(self.name) > 20:
raise ValidationError("Name too long!")
但是上面的代码永远不会打印“Hello!”
,因为full\u clean
方法只会引发ValidationError
任何人都可以建议,如何调用
full\u clean
并检查是否引发了ValidationError
子类异常?该full\u clean
方法收集在几个阶段引发的所有错误
您可以在此处检查它如何调用您的clean
方法:
幸运的是,原始异常保存在error\u dict
中
您可以尝试以下方法:
inst = MyDjangoModel(name="Foo", attribute=0)
try:
inst.full_clean()
except ValidationError as exc:
for original_exc in exc.error_dict['__all__']:
if isinstance(original_exc, MyDjangoModel.CustomValidationError):
print("Hello!")
elif isinstance(original_exc, ValidationError):
print("Bye!")
假设CustomValidationError
仅从clean
方法引发。否则,您还需要检查error\u dict
中的其他键
请注意,ifs的
顺序很重要:如果第一个为真,则第二个也将为真。除ValidationError之外的一个简单的也将处理所有子类实例。@schwobasegl是的,谢谢,但我想在引发ValidationError子类时添加自定义逻辑。底层异常收集在full\u clean
中,仍然可以访问。看看答案。
inst = MyDjangoModel(name="Foo", attribute=0)
try:
inst.full_clean()
except ValidationError as exc:
for original_exc in exc.error_dict['__all__']:
if isinstance(original_exc, MyDjangoModel.CustomValidationError):
print("Hello!")
elif isinstance(original_exc, ValidationError):
print("Bye!")