user1807271
user1807271

Reputation: 1006

Django: field dependencies

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

Answers (2)

Geo Jacob
Geo Jacob

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

Geo Jacob
Geo Jacob

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

Related Questions