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

Django中定义下拉框最简方法及显示描述提交编码的实现问题

嘿,我来帮你搞定这两个Django下拉框的问题!

1. Django中定义下拉框的最简方式

下拉框的实现分两种场景,最简写法各有不同:

  • 静态固定选项:直接用forms.ChoiceField,传入预定义的选项列表即可,格式是(提交值, 显示文本):
    class SimpleForm(forms.Form):
        favorite_color = forms.ChoiceField(
            choices=[('red', '红色'), ('blue', '蓝色'), ('green', '绿色')],
            label='喜欢的颜色'
        )
    
  • 动态数据库选项:用forms.ModelChoiceField,直接指定模型的queryset,默认会显示模型__str__方法返回的内容,提交时传递模型主键:
    class BookForm(forms.Form):
        selected_book = forms.ModelChoiceField(
            queryset=Book.objects.all(),
            label='选择书籍'
        )
    
2. 显示description但提交code的下拉框实现

你当前的代码有几个关键问题:

  • 用values_list("code", flat=True)返回的是单个code值的集合,而ModelChoiceField需要的是完整的模型实例,不是孤立的字段值;
  • to_field_name参数传错了:它指定的是提交时传递的字段,应该是字符串"code",而且你误写了未加引号的description;
  • 显示文本的控制不是靠to_field_name,而是需要自定义选项的生成逻辑。

正确的简便实现只需要两步,看完整代码:

class ChoiceTest(forms.Form):
    field_cd1 = forms.ModelChoiceField(
        queryset=ViewChoiceTest.objects.all(),  # 传完整的模型实例集合
        to_field_name="code",  # 提交表单时传递code字段的值
        label="Choice ",
        required=False,
    )
    
    # 重写label_from_instance,让下拉框显示description
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['field_cd1'].label_from_instance = lambda obj: obj.description

如果需要复用这个逻辑,还可以自定义字段类:

class DescriptionChoiceField(forms.ModelChoiceField):
    def label_from_instance(self, obj):
        return obj.description

class ChoiceTest(forms.Form):
    field_cd1 = DescriptionChoiceField(
        queryset=ViewChoiceTest.objects.all(),
        to_field_name="code",
        label="Choice ",
        required=False,
    )

这样设置后,下拉框会显示每条记录的description,表单提交时field_cd1的值就是对应的code,完全符合你的需求~

内容的提问来源于stack exchange,提问作者Lulu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 14:07:41