Поддержание актуальности списка выбора форм в Django
У меня есть форма на моем сайте администратора, где пользователь должен выбрать один объект из конкретной модели из выпадающего списка.
thing_choices = [(x.id, x) for x in Things.objects.all()]
class ThingSelector(forms.Form):
thing = forms.ChoiceField(choices=thing_choices)
Если я сначала добавлю новый объект Thing, а затем перейду на страницу с формой селектора, я обнаружу, что объект не отображается в раскрывающемся списке. Предположительно, эта форма была заполнена вариантами, когда я впервые поднял сервер. Тестирование подтверждает это, потому что, если я перезапущу Django, новый выбор появится в списке.
Как мне обойти это, чтобы я мог создавать объекты и отображать их в этой форме?
(Дополнительная информация: выбранная вещь отправляется вместе с формой для обработки на ней.)
Спасибо...
1 ответ
Если я сначала добавлю новый объект Thing, а затем перейду на страницу с формой селектора, я обнаружу, что объект не отображается в раскрывающемся списке. Предположительно, эта форма была заполнена вариантами, когда я впервые поднял сервер.
Правильно, переменная thing_choices
вычисляется, когда ваш код запускается впервые, и если он находится в той же области, что и ваша форма, вряд ли когда-либо снова запустится.
Более простой способ - использовать ModelChoiceField
, который ссылается на модель, а не ChoiceField
, Вот так:
class ThingSelector(forms.Form):
thing = forms.ModelChoiceField(queryset=Things.objects.all()
Это должно означать, что как новый Thing
объекты добавляются, они могут быть выбраны в форме.