Django的admin友好型raise

Django的admin后台真的是太好用了,用来写管理后台简直是爽歪歪的,但是笔者最近遇到一个问题,在model定义好以后,想在保存时做一些validate,比如下面这部分

class MyDemo(models.Model):
    file = models.FileField()

这里想限制文件后缀只能是apk格式的,刚开始我可能会这么写

class MyDemo(models.Model):
    file = models.FileField()

    def save(self, *args, **kwargs):
        if not self.file.url.endswith('.apk'):
            raise ValidationError("文件格式必须为apk")
        super().save(*args, **kwargs)

覆盖save方法,于是在保存非apk格式的文件时,就会抛错

image.png

直接进到了一个抛错页面,这显然不是我想要的,非常的不友好,这时候可以考虑使用Django的自带的模型验证功能

from django.core.exceptions import ValidationError

# Create your models here.


class MyDemo(models.Model):
    file = models.FileField()

    def clean(self):
        if not self.file.name.endswith('.apk'):
            raise ValidationError("文件格式必须为apk")

保存一个非apk格式的文件

image.png

报错为红色部分,这种形式比直接跳报错页面可友好多了
image.png

其中clean:提供自定义模型验证, 就比如我的需求,模型字段验证,并友好抛错
能实现同样功能的有clean_fields:

    def clean_fields(self, exclude=None):
        if not self.file.name.endswith('.apk'):
            raise ValidationError("文件格式必须为apk")

clean功能相似,多了一个exclude可选列表,可以传入那些不用去验证的字段。
不得不说,Django的功能真的很全,又增加一技。

你可能感兴趣的:(Django的admin友好型raise)