Поддержание актуальности списка выбора форм в 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 объекты добавляются, они могут быть выбраны в форме.

Другие вопросы по тегам