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

如何在Django中实现基于数据库的自定义下拉列表?

基于FinancialYearSetting动态生成GoalMaster的下拉选项

嘿,我来帮你搞定这个需求——把GoalMaster里固定的年份下拉选项改成从FinancialYearSetting数据库表中动态获取的内容。下面分几种场景给你具体的实现方法:

一、模型层动态设置Choices

首先,我们可以把原来固定的Fy_choices替换成一个可调用函数,这样每次需要获取选项时都会从数据库拉取最新的FinancialYearSetting数据:

def get_financial_year_choices():
    # 遍历所有FinancialYearSetting记录,生成(值, 显示文本)的元组列表
    return [(setting.financial_year_setting, setting.financial_year_setting) 
            for setting in FinancialYearSetting.objects.all()]

class GoalMaster(models.Model):
    # 注意:原字段名finacialYr少了个n,建议改成financialYr避免拼写问题
    financialYr = models.CharField(max_length=10, choices=get_financial_year_choices)
    employee_code = models.CharField(max_length=50)

不过要注意:Django在加载模型时会缓存choices的初始值,但因为我们用了可调用函数,每次渲染表单或访问字段选项时都会重新执行函数获取最新数据,所以大部分场景下是实时的。

二、Django Admin中确保实时更新

如果你在Django Admin中管理GoalMaster,为了确保下拉选项实时同步数据库的变化,最好在Admin类里重写字段的表单处理逻辑:

from django.contrib import admin
from .models import GoalMaster, FinancialYearSetting

class GoalMasterAdmin(admin.ModelAdmin):
    def formfield_for_dbfield(self, db_field, **kwargs):
        if db_field.name == 'financialYr':
            # 每次渲染表单时都从数据库拉取最新的年份选项
            kwargs['choices'] = [(s.financial_year_setting, s.financial_year_setting) 
                                 for s in FinancialYearSetting.objects.all()]
        return super().formfield_for_dbfield(db_field, **kwargs)

admin.site.register(GoalMaster, GoalMasterAdmin)
admin.site.register(FinancialYearSetting)

三、自定义表单中的实现

如果是在前端使用自定义的ModelForm,也可以在表单初始化时动态设置选项:

from django import forms
from .models import GoalMaster, FinancialYearSetting

class GoalMasterForm(forms.ModelForm):
    class Meta:
        model = GoalMaster
        fields = ['financialYr', 'employee_code']

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # 初始化表单时,从数据库加载最新的年份选项
        self.fields['financialYr'].choices = [(s.financial_year_setting, s.financial_year_setting) 
                                              for s in FinancialYearSetting.objects.all()]

小提示

  • 记得修正原模型里的字段拼写错误:finacialYr → financialYr,避免后续开发中出现不必要的bug
  • 如果FinancialYearSetting的数据更新很频繁,建议给查询加个排序,比如.order_by('financial_year_setting'),让下拉选项更规整

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:28:21