我有一个我修改过的ModelForm,它会在显示的表单上返回一个选项组multiselect的元组。元组的结构如下:
(
('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
答案 0 :(得分:1)
在导入时解释类的声明及其字段,choices
值的初始化也是如此。
您可以执行的操作是为__init__
定义SchedulerProfileForm
函数,您可以通过调用get_tree_data()
来初始化位置字段。
修改强>:
或者,继承自MultipleChoiceField
并在那里重新定义__init__
。