如何重新加载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
相关产品推荐
相关产品推荐

