Django管理后台中的自定义验证

60 投票
3 回答
57352 浏览
提问于 2025-04-18 13:41

我有一个非常简单的Django应用,用来记录我同事们的讲座。因为这个应用比较基础,所以我直接使用了Django自带的管理界面。以下是我的models.py文件:

#models.py
from django.db import models

class Lecture(models.Model):
    topic = models.CharField(max_length=100)
    speaker = models.CharField(max_length=100)
    start_date = models.DateField()
    end_date = models.DateField()

我需要确保在管理表单中,没人能把开始日期填在结束日期之后。为此,我查阅了Django的文档,了解如何在管理界面中进行自定义验证,并在我的admin.py文件中实现了以下内容:

#admin.py
from models import Lecture
from django.contrib import admin
from django import forms


class LectureForm(forms.ModelForm):
    class Meta:
        model = Lecture

        def clean(self):
            start_date = self.cleaned_data.get('start_date')
            end_date = self.cleaned_data.get('end_date')
            if start_date > end_date:
                raise forms.ValidationError("Dates are incorrect")
        return self.cleaned_data


class LectureAdmin(admin.ModelAdmin):
    form = LectureForm
    list_display = ('topic', 'speaker', 'start_date', 'end_date')

admin.site.register(Lecture, LectureAdmin)

然而,这些设置对我的管理界面没有任何影响,我仍然可以保存开始日期在结束日期之后的讲座,正如图片所示:在这里输入图片描述

我到底哪里做错了呢??

3 个回答

0
def clean(self): 
   if self.database_name != '111':
      raise ValidationError("You can use only letters ,numbers and 
      underscores.")

这个简单的方法在Django后台运行得非常好。

73

通常,你只需要在模型上定义一个clean()方法。

https://docs.djangoproject.com/en/2.1/ref/models/instances/#validating-objects

from django.core.exceptions import ValidationError

class Lecture(models.Model):
    topic = models.CharField(max_length=100)
    speaker = models.CharField(max_length=100)
    start_date = models.DateField()
    end_date = models.DateField()

    def clean(self):
        if self.start_date > self.end_date::
            raise ValidationError("Dates are incorrect")

这样做的话,在django的管理后台就能正常工作,而不需要创建一个表单类。

42

你遇到了缩进的问题。你的 clean 方法缩进在表单的 Meta 类里面。把它往回移动一个缩进层级。另外,确保 return 语句是在这个方法的缩进范围内。

撰写回答