You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 06:10:33