I’m trying to write a form clean method to ensure that an entered pair of dates is not currently covered by date ranges stored in the model.
So I want to catch fromdate >= value <= todate but the between filters in my clean methods aren’t getting it.
Can anyone offer some enlightenment?
Models.py
class Dates(models.Model):
fromdate = models.DateField()
todate = models.DateField()
Forms.py
class Form(forms.Form):
fromdate = forms.DateField()
todate = forms.DateField()
class Meta:
model = Dates
def clean_fromdate(self):
form_fromdate = self.cleaned_data.get('fromdate')
exists = Dates.objects.filter(fromdate__contains=form_fromdate).exists()
if exists == True:
raise forms.ValidationError(_("A period is already entered for this date"))
between = Dates.objects.filter(fromdate__gte=form_fromdate,
todate__lte=form_fromdate).exists()
if between == True:
raise forms.ValidationError(_("Period already between this date 1"))
return form_fromdate
def clean_todate(self):
form_todate = self.cleaned_data.get('todate')
exists = Dates.objects.filter(todate__contains=form_todate).exists()
if exists == True:
raise forms.ValidationError(_("A period is already entered for this date"))
between = PeriodsOfInactivity2012.objects.filter(fromdate__gte=form_todate,
todate__lte=form_todate).exists()
if between == True:
raise forms.ValidationError(_("Period already between this date 2"))
return form_todate
This should work for you
EDIT