Найти - Пользователи
Полная версия: ChoiceField - проблема с обновлением списка choices
Начало » Django » ChoiceField - проблема с обновлением списка choices
1
North
Столкнулся с такой непонятной проблемой. В форме объявлен ChoiceField и choices формируется из содержимого модели. Но при добавлении в эту модель записи или удаления из нее - choices - не обновляется, будто бы кешируется на серврере. Пробовал и функцией и просто формировать тупл для параметра - не получается. В чем может быть дело - перепробовал уже все. Причем, в функцию создания тупла вставлял принт - он выполняется только при первом импорте формы (она лежит в отдельном .py файле в том же модуле что и view). Примеры, как делал:

def get_queues():
return tuple([('','-----')] + [(x.id, x.name) for x in Queue.objects.all()])


....
field = forms.ChoiceField(.... choices=get_queues())
....
field = forms.ChoiceField(.... choices=tuple([('','-----')] + [(x.id, x.name) for x in Queue.objects.all()]))
....
Функцию пробовал объявлять как метод внутри класса. ПРобовал с конструктром, но все равно - такое ощущение, будто создается объект формы только один раз и кешируется. Столько переделал проектов на Django - и совершенно не понятно в чем дело :(
smal
такой вопрос - как организован сервер Django ? development или связка с apache/nginx/…. ?

для создания списка из елементов модели для choice/select полей форм нужно использовать forms.ModelChoiceField() или forms.ModelMultipleChoiceField()

можна использовать такой вариант в класе форме

choice_field = forms.ChoiceField(choices=get_queues())

def __init__(self, *args, **kwargs):
super(YourFormClass, self).__init__(*args, **kwargs)
self.fields['choice_field'].widget.choices = get_queues()
self.fields['choice_field'].choices = self.fields['choice_field'].widget.choices
North
Спасибо большое! Помогло просто
 self.fields['region'].choices = get_regions()
Я пробовал такую конструкцию
self.base_fields['choice'] = forms.ChoiceField(...choices=...)
Но она также не работала.
Как я мог не попробовать такой вариант :/
poltergeist
North Представь как на самом деле происходит заполнение choices у choice_field, оно происходит один раз при импорте модуля. Для работы с моделями есть такие варианты:
1) Если список всегда один и тот-же и берётся из базы:
choice_field = forms.ModelChoiceField(queryset=Queue.objects.all())
2) Если список ещё и меняется (если параметры запроса меняются), то так:
choice_field = forms.ModelChoiceField(queryset=Queue.objects.none())

def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
self.fields["choice_field"].queryset = Queue.objects.filter(some_field=some_value)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB