模型形式选择关键字作为具有变化数据的函数

Modelform choices keyword as function with changing data

我有一个 ModelForm,我已经修改它 returns 一个用于显示表单上的选项组多选的元组。元组的结构如下:

(
 ('Alabama', (
  ('1', 'Item 1'),
  ('2', 'Item 2'),
  )
 ),
 ('Alaska', (
  ('3', 'Item 3'),
  ('4', 'Item 4'),
  )
 ),
)

我 运行 遇到的问题是构成选择元组内容的基础数据可能会更改(可能会添加第 5 项或可能会删除第 4 项)但元组永远不会获取已更新 - 大概是因为 Django 知道元组是不可变的,并且我的 get_tree_data() 函数在服务器第一次启动后永远不会被调用。我如何覆盖该行为?我的代码如下:

def get_tree_data():
    sp = StateProvince.objects.all().values('state_province').order_by('state_province')
    my_dict = OrderedDict()
    for i in sp:
       for k in Location.objects.filter(state_province__state_province=i['state_province']):
           try: my_dict[i['state_province']].append([k.id, k.name])
           except KeyError: my_dict[i['state_province']] = [[k.id, k.name]]
    return tuple([(key, tuple([(a, b) for a, b in value])) for key, value in my_dict.iteritems()])


class SchedulerProfileForm(ModelForm):
    locations = MultipleChoiceField(choices=get_tree_data())
    class Meta:
        model = SchedulerProfile

编辑 根据接受的答案,代码:

class SchedulerProfileForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(SchedulerProfileForm, self).__init__(*args, **kwargs)
        self.fields['locations'] = MultipleChoiceField(choices=get_tree_data())

class Meta:
    model = SchedulerProfile

class 的声明及其字段在导入时解释,choices 值的初始化也是如此。

您可以做的是为 SchedulerProfileForm 定义 __init__ 函数,您可以在其中通过调用 get_tree_data() 来初始化位置字段。

编辑: 或者,从 MultipleChoiceField 继承并在那里重新定义 __init__