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



我正在管理员中使用模型表单。我有两个选择字段,其中填充了__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

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

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

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

也许对原始选择字段或选择小部件进行子类化?

我解决了在__init__中填充所有可用的选择字段的问题,并且仅填充小部件选项:

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

虽然就计算成本而言,这不是最好的方法,但这就是对我完成这项特定任务的方法。

刚刚发现这个解决方案

它对我有用 参考和旧帖子

最新更新