Modelform选择关键字作为改变数据的函数

时间:2015-02-01 16:19:24

标签: python django django-forms

我有一个我修改过的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

1 个答案:

答案 0 :(得分:1)

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

您可以执行的操作是为__init__定义SchedulerProfileForm函数,您可以通过调用get_tree_data()来初始化位置字段。

修改: 或者,继承自MultipleChoiceField并在那里重新定义__init__