如何检查是否引发了 Django ValidationError 子类?
How to check if Django ValidationError subclass was raised?
假设我有一个 Django 模型:
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!")
我想创建模型实例并验证它:
inst = MyDjangoModel(name="Foo", attribute=0)
try:
inst.full_clean()
except CustomValidationError:
print("Hello!")
except ValidationError:
print("Bye!")
但是上面的代码永远不会打印 "Hello!"
因为 full_clean
方法只引发 ValidationError
.
谁能建议,如何调用 full_clean
并检查是否引发了 ValidationError
子类异常?
full_clean
方法收集了几个阶段出现的所有错误。
您可以在此处查看它如何调用您的 clean
方法:https://github.com/django/django/blob/master/django/db/models/base.py#L1150
幸运的是,原始的异常被保存在 error_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_dict
.
中的其他键
请注意 if
的顺序很重要:如果第一个为真,则第二个也为真。
假设我有一个 Django 模型:
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!")
我想创建模型实例并验证它:
inst = MyDjangoModel(name="Foo", attribute=0)
try:
inst.full_clean()
except CustomValidationError:
print("Hello!")
except ValidationError:
print("Bye!")
但是上面的代码永远不会打印 "Hello!"
因为 full_clean
方法只引发 ValidationError
.
谁能建议,如何调用 full_clean
并检查是否引发了 ValidationError
子类异常?
full_clean
方法收集了几个阶段出现的所有错误。
您可以在此处查看它如何调用您的 clean
方法:https://github.com/django/django/blob/master/django/db/models/base.py#L1150
幸运的是,原始的异常被保存在 error_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_dict
.
请注意 if
的顺序很重要:如果第一个为真,则第二个也为真。