Django admin - 通过ModelForm中ChoiceField的ajax选项动态更新

时间:2013-09-21 23:26:37

标签: django django-admin django-forms django-widget

我在管理员中使用ModelForm。我有两个ChoiceFields,其中填充了__init__中的选项:

self.fields['city'] = forms.ChoiceField(
        required=False,
    )
self.fields['city'].choices=get_cities_tuple(region_code=region_code)
self.fields['city'].initial = my_initial_city_value

self.fields['zip'] = forms.ChoiceField(
        required=False,
    )
self.fields['zip'].choices=get_cities_tuple(region_code=region_code, city_name=city_name)
self.fields['zip'].initial = my_initial_zip_value

现在,通过ajax函数动态更新那些html选择渲染的选项。 问题是,在保存时,所选选项被识别为无效原因不在初始选择中:

Select a valid choice. <my_choice> is not one of the available choices.

有关如何解决它的任何想法?

可能是继承原始的ChoiceField或Select小部件吗?

2 个答案:

答案 0 :(得分:2)

我解决了在__init__中使用所有可用选项填充那些ChoiceField,并仅填充小部件选项:

def __init__(self, *args, **kwargs):

    self.fields['city'] = forms.ChoiceField(
        required=False,
    choices=get_all_cities_tuple()
    )   
    self.fields['zip'] = forms.ChoiceField(
    required=False,
    choices=get_all_zips_tuple()
    )

self.fields['city'].widget.choices=get_cities_tuple(region_code=region_code)
self.fields['city'].initial = my_initial_city_value 
self.fields['zip'].widget.choices=get_zips_tuple(
                                          region_code=region_code,
                                          city_name=city_name
                                      )
self.fields['zip'].initial = my_initial_zip_value

虽然这不是计算成本方面的最佳方法,但这对于我的特定任务来说是有用的。

答案 1 :(得分:1)

刚刚找到了这个解决方案

它对我有用,请参考Old Post