Mam my_forms.py Django tak:Lazy wybory w postaci Django
class CarSearchForm(forms.Form):
# lots of fields like this
bodystyle = forms.ChoiceField(choices=bodystyle_choices())
Każdy wybór jest np ("Saloon", "Saloon (15 samochodów)"). Więc wybory są obliczane przez tę funkcję.
def bodystyle_choices():
return [(bodystyle.bodystyle_name, '%s (%s cars)' %
(bodystyle.bodystyle_name, bodystyle.car_set.count()))
for bodystyle in Bodystyle.objects.all()]
Mój problem polega na tym, że funkcje wyboru są wykonywane za każdym razem, gdy tylko importuję my_forms.py. Myślę, że wynika to ze sposobu, w jaki Django deklaruje swoje pola: w klasie, ale nie w metodzie klasowej. Co jest w porządku, ale mój views.py importuje moje_forms.py, więc wyszukiwania wyborów są wykonywane dla każdego żądania bez względu na to, który widok jest używany.
Myślałem, że może wprowadzenie wyborów = bodystyle_choices bez wspornika będzie działać, ale mam:
'function' object is not iterable
Oczywiście można używać buforowania i umieścić „my_forms przywóz” tylko w funkcji widoku wymagane, ale to nie zmień główny punkt: moje wybory muszą być leniwy!
Zdecydowanie najlepsze rozwiązanie, to powinna być akceptowana odpowiedź imo. –
/agree to najczystsze rozwiązanie, jakie dotychczas widziałem, dzięki czemu można pominąć problemy z walidacjami, co stanowi istotną różnicę w stosunku do ModelChoiceField. – Hassek
To nie działa, przynajmniej z Django 1.6, ponieważ 'ChoiceField._set_choices' robi' self._choices = self.widget.choices = list (value) ' – spookylukey