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

如何重新加载Django model-form中动态更新的choices选项

问题原因

你当前的写法在项目启动时就执行了feature_tuples()函数,将返回的固定元组直接写入了字段定义,后续修改可选值后已加载的字段和表单不会自动同步更新。

实现方案

1. 调整模型字段定义(适配Django 3.0+)

将choices参数传入函数本身而非执行结果,Django 3.0及以上版本支持传入可调用对象作为choices,会在需要时动态调用获取最新值:

def feature_tuples():
    # 此处可替换为你动态获取可选值的逻辑,比如查询配置表、读缓存等
    features = (('a', 'a'), ('b', 'b'))
    return features

class Sample(models.Model):
    choices_tuple = models.CharField(
        max_length=20, 
        blank=True, 
        null=True, 
        choices=feature_tuples # 去掉括号,传入函数本身而非执行结果
    )

如果使用Django 3.0以下版本,模型侧不需要修改,直接走下一步表单层的逻辑即可。

2. 自定义ModelForm重载初始化逻辑

ModelForm默认会在类定义时加载一次choices,需要手动在初始化方法中每次拉取最新的可选值:

from django import forms
from .models import Sample, feature_tuples

class SampleForm(forms.ModelForm):
    class Meta:
        model = Sample
        fields = ['choices_tuple']

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # 每次表单初始化时重新加载最新choices
        self.fields['choices_tuple'].choices = feature_tuples()

3. 对接动态修改逻辑

你需要将feature_tuples函数的返回值来源替换为可修改的持久化存储,比如专门存储配置项的数据库表、Redis缓存等,用户修改可选值时更新对应存储的数据,后续表单初始化时自然会加载最新的选项。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 20:30:01