Reputation: 3474
I have been looking for ways to set my Django form to only accept dates that are today or days in the future. I currently have a jQuery datepicker on the frontend, but here is the form field to a modelform.
Thanks for the help, much appreciated.
date = forms.DateField(
label=_("What day?"),
widget=forms.TextInput(),
required=True)
Upvotes: 23
Views: 21254
Reputation: 477
Found out MinValueValidator works perfectly for dates as well.
import datetime
from django.core.validators import MinValueValidator
from django.db import models
...
some_date = models.DateField(validators=[MinValueValidator(datetime.date.today)])
Upvotes: 4
Reputation: 174
Another useful solution is to tie validation to fields using the validators keyword argument. This is a handy way of keeping your Form code clear and enabling reuse of validation logic. For e.g
def present_or_future_date(value):
if value < datetime.date.today():
raise forms.ValidationError("The date cannot be in the past!")
return value
class MyForm(forms.Form):
date = forms.DateField(...
validators=[present_or_future_date])
Upvotes: 10
Reputation: 1815
You could add a clean()
method in your form to ensure that the date is not in the past.
import datetime
class MyForm(forms.Form):
date = forms.DateField(...)
def clean_date(self):
date = self.cleaned_data['date']
if date < datetime.date.today():
raise forms.ValidationError("The date cannot be in the past!")
return date
See http://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-a-specific-field-attribute
Upvotes: 35
Reputation: 9716
If you are using Django 1.2+ and your model will always force this rule, you can also take a look at model validation. The advantage will be that any modelform based on the model will use this validation automatically.
Upvotes: 2