2015-07-31 3 views
2

Я прочитал cleaning and validating fields that depend on each other. Однако я все еще не могу заставить свою чистую функцию работать в браузере. В настоящее время он ничего не делает. Что мне не хватает?Django: зависимые от поля

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) 
+0

Вам нужно будет показать свое мнение. И ваш чистый метод должен возвращать все 'cleaned_data', а не только start_date. –

+0

обновил его. Благодарю. – user1807271

+0

Я думаю, что моя проблема в том, что я не возвращаю 'cleaned_data' – user1807271

ответ

3

Попробуйте это:

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 
+0

Спасибо. Я думаю, что моя проблема в том, что я не возвращаю 'cleaned_data'. – user1807271

+0

Когда я возвращаю 'cleaned_data', куда он отправляется? Я все еще не работаю. Где я могу назвать clean()? – user1807271

+0

clean() выполняется при вызове form.is_valid(), если он недействителен, тогда cleaned_data будет отправлен обратно в шаблон. –

0

Попробуйте это;

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 
+0

Я не уверен, что мы на одной странице. Почему я не могу использовать 'end_date' и' start_date' в моем методе 'search()'? Я предпочел бы создать запрос там, чем поставить это в представление. Разве это невозможно? и что возвращает «return cleaned_data» точно? – user1807271

+0

Я отредактировал ответ, здесь parse (self.cleaned_data.get ('end_date')) преобразует вашу строковую дату в объект даты python. –

+0

Это не моя проблема. Я попытаюсь найти ответ в другом месте. Благодаря! – user1807271

Смежные вопросы