我最初的想法是编写一个可返回选择的可调用对象,该选择将针对每个请求进行评估。
import datetimedef year_choices(): return [(r,r) for r in range(1984, datetime.date.today().year+1)]def current_year(): return datetime.date.today().yearclass MyModel(models.Model): year = models.IntegerField(_('year'), choices=year_choices, default=current_year)
但是,这不起作用,因为Django的check框架不允许将year_choices用作默认值。即使您可以破解要动态生成的选择,它也会具有Django每年都会在选择更改时尝试创建迁移的缺点。
您可以通过在表单级别生成选择来避免这种情况。您可以在模型中使用验证器来防止无效数据。请注意,
MaxValuevalidator该函数包含在函数中,
max_value_current_year以避免每年重新迁移。
import datetimefrom django.core.validators import MaxValuevalidator, MinValuevalidatordef current_year(): return datetime.date.today().yeardef max_value_current_year(value): return MaxValuevalidator(current_year())(value)class MyModel(models.Model): year = models.IntegerField(_('year'), validators=[MinValuevalidator(1984), max_value_current_year])def year_choices(): return [(r,r) for r in range(1984, datetime.date.today().year+1)]class MyForm(forms.ModelForm): year = forms.TypedChoiceField(coerce=int, choices=year_choices, initial=current_year)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)