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
在视图中:我需要显示从固定值(比如 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