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:
Qu'est-ce que je fais mal ??
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.
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.