Администратор Django - динамически обновлять с помощью ajax-выборов ChoiceField в ModelForm

Я работаю с 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

теперь параметры отображаемого выбора html динамически обновляются с помощью функций ajax. Проблема в том, что при сохранении выбранные варианты признаются недействительными, потому что их нет в исходных вариантах:

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

Любая идея о том, как это решить?

Может быть, создать подкласс исходного ChoiceField или виджета Select?


person Luke    schedule 21.09.2013    source источник


Ответы (2)


Я решил заполнить эти ChoiceField в __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

Хотя это не лучший подход с точки зрения вычислительных затрат, именно он сработал для меня для этой конкретной задачи.

person Luke    schedule 24.09.2013

Только что узнал это решение

Это сработало для меня и Old Post

person Ramez Ashraf    schedule 09.01.2014
comment
Ссылка мне помогла. Ссылка на Stackoverflow. Stackoverflow меняет свои ссылки? Ответ по ссылке очень короткий. Включение основных частей потребует копирования всего ответа. Тогда возникнут вопросы о плагиате. - person Chuck; 11.10.2014