web-dev-qa-db-fra.com

Validation personnalisée dans Django admin

J'ai une application Django très simple pour enregistrer les conférences données à mes collègues. Comme c'est assez élémentaire, j'utilise l'administration Django elle-même. Ici est mon 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()

Je dois m'assurer que personne n'entre la date de début après la date de fin dans les formulaires d'administration, j'ai donc lu les documents Django pour une validation personnalisée dans l'admin et mis en œuvre ce qui suit dans mon 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)

Cependant, cela n'a aucun effet sur mon administrateur et je suis en mesure d'enregistrer les conférences où start_date est après end_date comme indiqué dans l'image:enter image description here

Qu'est-ce que je fais mal ??

30
Amistad

Vous avez un problème d'indentation. Votre méthode clean est mise en retrait dans la classe Meta du formulaire. Reculez d'un niveau. Assurez-vous également que l'instruction return est en retrait dans la méthode.

22
Daniel Roseman

Habituellement, vous souhaitez simplement définir une méthode clean () sur le modèle lui-même.

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")

Quelque chose comme ça fonctionnera dans l'administration Django sans avoir besoin de créer une classe de formulaire.

12
aris