HTML选择Django ModelForm

时间:2017-02-26 12:05:32

标签: html django django-models modelform

在视图中:我需要显示从固定值(例如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'按分钟'分钟'测试它,并且范围保持固定,上限为启动服务器时的分钟数,即模型创建时。我希望这个范围由视图决定,即在浏览器上加载表单时。

1 个答案:

答案 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