web-dev-qa-db-ja.com

Django adminでのカスタム検証

私は同僚に与えられた講義を記録するために非常にシンプルな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)

ただし、これは私の管理者にはまったく影響を与えず、画像に見られるようにstart_dateがend_dateの後にある講義を保存できます。enter image description here

私は何を間違っていますか?

30
Amistad

インデントの問題があります。 cleanメソッドは、フォームのMetaクラス内でインデントされます。 1レベル戻します。また、returnステートメントがメソッド内でインデントされていることを確認してください。

22
Daniel Roseman

通常、モデル自体に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 adminで動作します。

12
aris