ho un my_forms.py Django come questo:scelte pigri in forma Django
class CarSearchForm(forms.Form):
# lots of fields like this
bodystyle = forms.ChoiceField(choices=bodystyle_choices())
Ogni scelta è per esempio ("Saloon", "Saloon (15 auto)"). Quindi le scelte sono calcolate da questa funzione.
def bodystyle_choices():
return [(bodystyle.bodystyle_name, '%s (%s cars)' %
(bodystyle.bodystyle_name, bodystyle.car_set.count()))
for bodystyle in Bodystyle.objects.all()]
Il mio problema è le scelte funzioni sono sempre eseguiti ogni volta che semplicemente importare my_forms.py. Penso che questo sia dovuto al modo in cui Django dichiara i suoi campi: nella classe ma non in un metodo di classe. Che va bene, ma il mio views.py importa my_forms.py in modo che le ricerche delle scelte vengano fatte su ogni richiesta indipendentemente dalla vista utilizzata.
ho pensato che forse mettendo le scelte = bodystyle_choices senza staffa avrebbe funzionato, ma ottengo:
'function' object is not iterable
Ovviamente posso usare la cache e mettere il "my_forms importazione" solo nelle funzioni di visualizzazione desiderata, ma che non lo fa cambia il punto principale: le mie scelte devono essere pigre!
Definitivamente la soluzione superiore, questa dovrebbe essere la risposta accettata imo. –
/agree è la soluzione più pulita che ho visto finora e questo consente di saltare i problemi con le convalide, una differenza importante rispetto a ModelChoiceField. – Hassek
Questo non sembra funzionare, almeno con Django 1.6, perché 'ChoiceField._set_choices' fa' self._choices = self.widget.choices = list (valore) ' – spookylukey