在本教程中,我们将学习如何在 Django admin 上显示自定义验证异常。
了解问题
当我们尝试通过表单保存不符合要求的数据时,Django自带admin将抛出异常。通常我们需要根据项目的需要创建自定义验证器并在Django admin中显示异常信息。比如您希望用户输入的电话号码采用特定格式,或者您希望确保某个字段以大写字母开头。
有很多方法可以实现这一点,但如果您的目标是确保仅通过Django admin进行适当的验证,那么本教程适合您。
在 Django Admin 中显示自定义验证异常
我们将在本教程中以流行的博客项目为例,目标是确保帖子的标题采用了正确的大小写格式。如果标题不符合格式要求,Django Admin中将显示如下异常信息:
让我们先看看现有的models.py和admin.py文件。
models.py
class Post(models.Model):
title = models.CharField(max_length=200, unique=True)
slug = models.SlugField(max_length=200, unique=True)
author = models.ForeignKey(
User, on_delete=models.CASCADE, related_name="blog_posts")
updated_on = models.DateTimeField(auto_now=True)
content = models.TextField()
created_on = models.DateTimeField(auto_now_add=True)
status = models.IntegerField(choices=STATUS, default=0)
summary = models.CharField(max_length=500, null=True, blank=True)
class Meta:
ordering = ["-created_on"]
def __str__(self):
return self.title
admin.py
@admin.register(Post)
class PostAdmin(ModelAdmin):
list_display = ('title', 'slug', 'status', 'created_on')
list_filter = ('status', 'created_on')
search_fields = ['title', 'content']
prepopulated_fields = {'slug': ('title',)}
现在要为管理站点创建自定义验证器,我们需要为我们的模型创建一个自定义表单。可以在同一个文件或单独的文件中创建一个这样的表单PostForm,如下所示:
from django import forms
class PostForm(forms.ModelForm):
def clean(self):
title = self.cleaned_data['title']
if not title.istitle():
raise forms.ValidationError({'title': "Not a proper titlecased string"})
模型表单带有clean()负责执行验证的方法,它从cleaned_data字典中获取标题值并运行验证。如果验证失败,则引发ValidationError异常消息。
最后我们需要将自定义的表单与PostAdmin结合。
@admin.register(Post)
class PostAdmin(ModelAdmin):
form = PostForm
list_display = ('title', 'slug', 'status', 'created_on')
list_filter = ('status', 'created_on')
search_fields = ['title', 'content']
prepopulated_fields = {'slug': ('title',)}
到此,大功告成!保存文件并启动Django测试服务器就可以看到效果啦。
原文:https://djangocentral.com/displaying-custom-validation-exception-in-django-admin/
翻译:大江狗
推荐阅读