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

您不能在字段定义中执行此操作,因为每个字段都是单独验证的。但是,您可以为您的表单编写一个自定义的清理方法,为您检查开始日期和结束日期。

于 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 回答