2

開始日と終了日を入力として受け取るフォームがあります。有効な範囲を設定する必要がありますが、これは別のフィールドであるサイトに依存しています。そのようです:

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 値を生成することです。

どんな助けでも大歓迎です。

4

2 に答える 2

2

各フィールドは個別に検証されるため、フィールド定義でこれを行うことはできません。ただし、開始日と終了日をチェックするフォームのカスタム clean メソッドを作成することもできます。

于 2012-04-05T23:44:20.270 に答える
1

動的な検証クラス、つまり、定数ではなく検証中に呼び出される関数を取るクラスを作成できます。

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

初期化中に関数を呼び出してはならないことに注意してください (DynamicMaxValueValidator の作成時に maxdate の後ろに括弧を付けないでください)。

于 2014-02-10T23:37:40.743 に答える