我有一个表格,它以开始日期和结束日期作为输入。我需要设置有效范围,但这取决于另一个字段,网站。像这样:
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值。
任何帮助都非常感激。
答案 0 :(得分:2)
您不能在字段定义中执行此操作,因为每个字段都是单独验证的。但是,您可以为表单编写custom clean method,以便为您检查开始日期和结束日期。
答案 1 :(得分: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后面没有任何约束)