HTML Select Django ModelForm 中带有动态列表的下拉列表

HTML Select dropdown with dynamic list in Django 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)

这会生成具有所需 select 字段的表单,但值不会更改。我将 'Years' 替换为 'Minutes' 进行测试,并且范围保持固定,上限为启动服务器时 的分钟数 ,即,当模型被创建时。我希望这个范围由视图决定,即当表单加载到浏览器时。

首先,这段代码不属于模型,而是属于表单。

其次,如果您需要动态的东西,它们必须进入 __init__ 方法,而不是 class 级别。所以:

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