Пользовательская проверка в администраторе Django

У меня очень простое приложение 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 docs для пользовательской проверки в admin и реализовал следующее в моей 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)

Однако это не влияет на моего администратора, и я могу сохранить лекции, где start_date после end_date, как видно на изображении: enter image description here

Что я делаю неправильно?

Ответы

Ответ 1

У вас проблема с отступом. Ваш метод clean имеет отступ в виде класса Meta. Переместите его на один уровень. Кроме того, убедитесь, что оператор return имеет отступы внутри метода.

Ответ 2

Обычно вы просто хотите определить метод 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 без необходимости создавать класс формы.

Ответ 3

Я сталкиваюсь с той же проблемой и реализовал решение как предложенный aris, однако, когда ошибка появляется, желтая страница исключения отображается вместо приятного сообщения. Однако я даже поднял этот способ raise ValidationError({"start_date":"Dates are incorrect"})