我最初的想法是编写一个可返回选择的可调用对象,该选择将针对每个请求进行评估。
import datetime
def year_choices():
return [(r,r) for r in range(1984, datetime.date.today().year+1)]
def current_year():
return datetime.date.today().year
class MyModel(models.Model):
year = models.IntegerField(_('year'), choices=year_choices, default=current_year)
但是,这不起作用,因为Django的check框架不允许将year_choices用作默认值。即使您可以破解要动态生成的选择,它也会具有Django每年都会在选择更改时尝试创建迁移的缺点。
您可以通过在表单级别生成选择来避免这种情况。您可以在模型中使用验证器来防止无效数据。请注意,MaxValueValidator
该函数包含在函数中,max_value_current_year
以避免每年重新迁移。
import datetime
from django.core.validators import MaxValueValidator, MinValueValidator
def current_year():
return datetime.date.today().year
def 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)