在视图中:我需要显示从固定值(例如2005年)到当前年份的年份下拉列表。现在,这个列表虽然是动态的,但并不是来自数据库。此外,我希望列表随着时间的推移而扩展。
在模型中:我希望此字段类似于IntegerField(?),它仅将值从2005保存到3000,否则会抛出验证错误。
我能做什么 - 在视图中将下拉列表作为ChoiceField,并为模型设置验证器。
我想要什么 - 我希望在这个字段中使用Django中的ModelForm,以及表单中的其他字段映射到我的模型的字段。这意味着我不会在我的表单中定义字段,而只是在模型中。因此,问题是我的方法应该是什么?
到目前为止我已经尝试过了 -
class Member(models.Model):
d = int(datetime.datetime.now().strftime("%Y"))
ch = [(X,X) for X in range(2005,d)]
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
membership_type = models.IntegerField(validators=[validate_membership_type])
batch = models.IntegerField(choices= ch)
这将生成具有所需选择字段的表单,但值不会更改。我取代了' Years'按分钟'分钟'测试它,并且范围保持固定,上限为启动服务器时的分钟数,即模型创建时。我希望这个范围由视图决定,即在浏览器上加载表单时。
答案 0 :(得分:1)
首先,此代码不属于模型,而是属于表单。
其次,如果你需要动态的东西,它们必须采用__init__
方法,而不是类级。所以:
class MemberForm(forms.ModelForm):
class Meta:
model = Member
fields = [..., 'batch', ...]
def __init__(self, *args, **kwargs):
super(MemberForm, self).__init__(*args, **kwargs)
d = datetime.datetime.now().year
ch = [(X,X) for X in range(2005, d)]
self.fields['batch'].choices = ch