Reputation: 1006
I've read over cleaning and validating fields that depend on each other. However I still can't get my clean function to work in the browser. It currently doesn't do anything. What am I missing?
forms.py
from django import forms
from incidents.models import *
import datetime
from django.utils import dateparse
from django.utils import timezone
from functools import partial
DateInput = partial(forms.DateInput, {'class': 'datepicker'})
from django.core.exceptions import ValidationError
class IncidentSearchForm(forms.Form):
start_date = forms.DateField(
label="Incident Date Occurs Between",
required=False,
widget=DateInput()
)
end_date = forms.DateField(
label="And",
required=False,
widget=DateInput()
)
def clean(self):
cleaned_data = super(IncidentSearchForm, self).clean()
start_date = cleaned_data.get("start_date")
end_date = cleaned_data.get("end_date")
if start_date or end_date:
raise forms.ValidationError(
"Both date fields are required if trying to search by date."
)
if end_date < start_date:
raise forms.ValidationError(
"End date should be greater than start date."
)
def search(self):
start_date = self.cleaned_data.get('start_date')
end_date = self.cleaned_data.get('end_date')
query = Incident.objects.all()
if start_date is not None:
query = query.filter(start_date=self.cleaned_data.get('start_date'))
if end_date is not None:
query = query.filter(end_date=self.cleaned_data.get('end_date')
return(query)
views.py
@login_required(login_url='/login/')
def index(request):
template = "index.html"
form = IncidentSearchForm(request.GET)
if 'open' in request.GET:
if form.is_valid():
incident_list = form.search()
context = { "form": form,
"incident_list": incident_list}
return render(request, template, context)
else:
context = { "form": form }
return render(request, template, context)
else:
form = IncidentSearchForm()
incident_list = Incident.objects.filter(open = 'True').order_by('-incident_date_reported')
context = { "form": form,
"incident_list": incident_list}
return render(request, template, context)
Upvotes: 2
Views: 951
Reputation: 6009
Try this;
from dateutil.parser import parse
def search(self):
start_date = self.cleaned_data.get('start_date')
end_date = self.cleaned_data.get('end_date')
query = Incident.objects.all()
if start_date is not None:
query = query.filter(start_date=parse(self.cleaned_data.get('start_date')))
if end_date is not None:
query = query.filter(end_date=parse(self.cleaned_data.get('end_date'))
return query
Upvotes: 0
Reputation: 6009
Try this:
def clean(self):
cleaned_data = super(IncidentSearchForm, self).clean()
start_date = cleaned_data.get("start_date")
end_date = cleaned_data.get("end_date")
if not start_date or not end_date:
raise forms.ValidationError(
"Both date fields are required if trying to search by date."
)
if end_date < start_date:
raise forms.ValidationError(
"End date should be greater than start date."
)
return cleaned_data
Upvotes: 3