Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.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 ValidationError子类?_Python_Django_Python 2.7_Django 1.6 - Fatal编程技术网

Python 如何检查是否引发了Django ValidationError子类?

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 <

假设我有一个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!")
但是上面的代码永远不会打印
“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!")