2012-04-05 2 views
0

I input.I으로 시작 날짜와 종료 날짜를 취하는 형태는 유효 범위를 설정해야하지만 다른 분야, 사이트에 의존합니다. 그래서 같이 :장고 양식 유효성 검사

class GraphForm(forms.Form): 
    site = forms.ChoiceField(choices=SITE_CHOICES, label=ugettext_lazy('Site'), 
       widget=forms.Select(attrs={"onChange":'filterField()'}) 
       ) 
    startdate = forms.DateField(
       label=ugettext_lazy('Start Date'), 
       validators=[MaxValueValidator(maxdate)], 
       ) 
    enddate = forms.DateField(
       label=ugettext_lazy('End Date'), 
       validators=[MaxValueValidator(maxdate)], 
       ) 
    ... 

하지만이 사이트가 선택된 경우에만 maxdate의 값을 얻을 수 있습니다 :

getdate = Reports.objects.filter(site=site_name).values('recorded_on').order_by('-recorded_on')[:1] 
maxdate = getdate[0]['recorded_on'] 

내 문제는 내가이 기능을 달성 할 수있는 방법입니다 - 내가 사이트의 입력을받을 수 있도록 양식을 검증하기 전에 maxdate 값을 생성하십시오.

도움을 주시면 감사하겠습니다.

답변

2

각 필드의 유효성이 별도로 확인되므로 필드 정의에서이를 수행 할 수 없습니다. 그러나 시작일과 종료일을 확인하는 양식에 custom clean method을 작성할 수 있습니다.

1

당신은 일정하지만 검증 중에 호출되는 기능을하지 않는 동적 검증 클래스, 즉 클래스를 작성할 수 있습니다. 합니다 (DynamicMaxValueValidator를 만들 때 maxdate 뒤에 더 paranthesis)는 초기화 중에 함수를 호출하지합니다

from django.core.validators import MaxValueValidator 
from django.core.exceptions import ValidationError 

class DynamicMaxValueValidator(MaxValueValidator): 
    def __call__(self, value): 
     cleaned = self.clean(value) 
     params = {'limit_value': self.limit_value(), 'show_value': cleaned} 
     if self.compare(cleaned, self.limit_value()): 
      raise ValidationError(
       self.message % params, 
       code=self.code, 
       params=params, 
       ) 

def maxdate(): 
    getdate = Reports.objects.filter(site=site_name).values('recorded_on').order_by('-recorded_on')[:1] 
    return getdate[0]['recorded_on'] 

class GraphForm(forms.Form): 
    site = forms.ChoiceField(choices=SITE_CHOICES, label=ugettext_lazy('Site'), 
       widget=forms.Select(attrs={"onChange":'filterField()'}) 
       ) 
    startdate = forms.DateField(
       label=ugettext_lazy('Start Date'), 
       validators=[DynamicMaxValueValidator(maxdate)], 
       ) 
    enddate = forms.DateField(
       label=ugettext_lazy('End Date'), 
       validators=[DynamicMaxValueValidator(maxdate)], 
       ) 
    ... 

공지 사항