Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Custom validation in Django admin

I have a very simple Django app in order to record the lectures given my colleagues.Since it is quite elementary,I am using the Django admin itself. Here is my 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() 

I need to ensure that nobody enters the start date after the end date in the admin forms,so I read the django docs for custom validation in the admin and implemented the following in my 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) 

However,this has no effect whatsoever on my admin and I am able to save lectures where start_date is after end_date as seen in the image:enter image description here

What am I doing wrong ??

like image 554
Amistad Avatar asked Jul 17 '14 11:07

Amistad


2 Answers

Usually you just want to define a clean() method on the model itself.

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

Something like that will work in the django admin without any need to create a form class.

like image 148
aris Avatar answered Oct 02 '22 14:10

aris


You have an indentation issue. Your clean method is indented within the form's Meta class. Move it back one level. Also, ensure that the return statement is indented within the method.

like image 22
Daniel Roseman Avatar answered Oct 02 '22 12:10

Daniel Roseman