2012-04-05 11 views
0

開始日と終了日を入力に使用するフォームがあります。有効な範囲を設定する必要がありますが、別のフィールド、サイトに依存しています。そのような:動的値を持つMaxValueValidatorを使用したDjangoフォームの検証

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)], 
       ) 
    ... 

お知らせ

関連する問題