Django中动态为ChoiceField添加选项及设置initial值问题
解决Django表单ChoiceField动态加载AWS备份列表及设置初始值问题
问题核心
你当前的写法存在关键错误:把下拉选项列表formatted_picker塞进了initial参数,但initial的作用是设置字段默认选中值,而非定义下拉选项集合。下拉选项必须通过ChoiceField的choices属性来配置。
修正方案
1. 修改forms.py,让表单支持接收动态选项
class RestoreAMIForm(forms.ModelForm): ami = forms.ChoiceField() def __init__(self, amis_choices=None, *args, **kwargs): super(RestoreAMIForm, self).__init__(*args, **kwargs) # 保持原有只读字段设置 self.fields['server_name'].widget.attrs['readonly'] = True self.fields['module_name'].widget.attrs['readonly'] = True self.fields['instance_id'].widget.attrs['readonly'] = True # 传入动态获取的AWS备份选项 if amis_choices: self.fields['ami'].choices = amis_choices class Meta: model = RestoreRequest fields = ['server_name', 'module_name', 'instance_id', 'ami', 'justification']
2. 修改views.py,传递选项列表并设置默认选中值
amis = helper_functions.get_all_backups(instance_id, GlobalrunEnv) context['ami'] = amis just_amis = [i[0] for i in context['ami']] formatted_picker = helper_functions.iterate_over_list(just_amis) # 创建表单时,单独传递选项列表给amis_choices,initial只设置默认选中项 context['restore_ami_form'] = RestoreAMIForm( amis_choices=formatted_picker, initial={ 'server_name': context['tags']['Name'], 'instance_id': context['server_details']['InstanceId'], 'module_name': context['passed_slug'], # 设置默认选中第一个备份(值对应formatted_picker中元组的第一个元素) 'ami': '1' } )
补充说明
- 动态选项通过
amis_choices参数传入表单,在__init__方法中赋值给choices,实现AWS备份列表的实时加载; initial里的ami值必须匹配formatted_picker中某一项的第一个元素(比如'1'对应ami-04e05d8b305348d89),才能让该选项默认选中;- 如果需要默认选中最新备份,可根据
amis的排序逻辑,取对应选项的key替换'1'即可。
内容的提问来源于stack exchange,提问作者TwoMany
相关产品推荐
相关产品推荐

