У меня есть Django my_forms.py вроде этого:Ленивые выбор в Django форме
class CarSearchForm(forms.Form):
# lots of fields like this
bodystyle = forms.ChoiceField(choices=bodystyle_choices())
Каждый выбор, например, («Салон», «Салон (15 автомобилей)»). Таким образом, выбор вычисляется с помощью этой функции.
def bodystyle_choices():
return [(bodystyle.bodystyle_name, '%s (%s cars)' %
(bodystyle.bodystyle_name, bodystyle.car_set.count()))
for bodystyle in Bodystyle.objects.all()]
Моя проблема в том, что функции выбора выполняются каждый раз, когда я просто импортирую my_forms.py. Я думаю, это связано с тем, как Django объявляет свои поля: в классе, но не в методе класса. Это нормально, но мой view.py импортирует my_forms.py, поэтому поиск по выбору выполняется по каждому запросу независимо от того, какой вид используется.
Я подумал, что, может быть, положить выбор = bodystyle_choices, без кронштейна будет работать, но я получаю:
'function' object is not iterable
Очевидно, что я могу использовать кэширование и поставить «импорт my_forms» только в функциях просмотра требуется, но это не измените главное: мои выборы должны быть ленивыми!
Определенно превосходное решение, это должен быть принятый ответ imo. –
/Согласие - это самое чистое решение, которое я видел до сих пор, и это позволяет пропустить проблемы с проверками, что является важным отличием от ModelChoiceField. – Hassek
Это не работает, по крайней мере, с Django 1.6, потому что 'ChoiceField._set_choices' делает' self._choices = self.widget.choices = list (value) ' – spookylukey