Django:模型(非表单)级别的验证?

时间:2017-02-02 13:46:53

标签: django validation django-models

我希望失败:

MyModelWithSlug.objects.create(name='Foo', slug='abc . ü')

字符串abc . ü不是django中的有效slug。

如何使上线失败?

1 个答案:

答案 0 :(得分:2)

阅读Alasdair对OP的评论

Django提供了一个名为 CLEAN 的钩子来添加自定义验证,但要注意Django不会在savecreate上自动调用它。所以你必须在模型上覆盖save()。(感谢@alasdair纠正我。)

因此模型变为:

class MyModelWithSlug(models.Model):
    name = models.CharField(max_length=200, default="")
    slug = models.CharField(max_length=200, null=True, blank=True)

    def clean(self):
        # will raise an Validation Error even if unicode is present. refer validate_unicode_slug
        self.slug = validators.validate_slug(self.slug)

    def save(self):
        self.full_clean() # calls self.clean() as well cleans other fields
         return super(MyModelWithSlug, self).save(*args, **kwargs)

或更好:

class MyModelWithSlug(models.Model):
    name = models.CharField(max_length=200, default="")
    slug = models.SlugField(max_length=200, null=True, blank=True)

<强> VALIDATE SLUG LINK

<强> SLUG FIELD LINK