模型形式选择关键字作为具有变化数据的函数
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__
。
我有一个 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__
。