Diciamo che ho alcuni modelli inventati:Come modificare scelte di ModelMultipleChoiceField
class Author(Model):
name = CharField()
class Book(Model):
title = CharField()
author = ForeignKey(Author)
E diciamo che voglio usare un ModelForm per Book:
class BookForm(ModelForm):
class Meta:
model = Book
semplice finora. Ma diciamo anche che ho un sacco di Autori nel mio database, e non voglio avere un campo di scelta multipla così lungo. Quindi, mi piacerebbe è quello di limitare il queryset sul campo dell'autore ModelMultipleChoiceField di BookForm. Diciamo anche che il set di query che desidero non può essere scelto fino a __init__
, perché si basa su un argomento da passare.
Questo sembra che potrebbe fare il trucco:
class BookForm(ModelForm):
class Meta:
model = Book
def __init__(self, letter):
# returns the queryset based on the letter
choices = getChoices(letter)
self.author.queryset = choices
Naturalmente, se questo appena finito di lavorare io non sarei qui. Questo mi fa diventare un AttributeError. L'oggetto 'BookForm' non ha attributo 'autore'. Così, ho anche provato qualcosa di simile, dove cerco di ignorare campo di default del ModelForm e quindi impostare in un secondo momento:
class BookForm(ModelForm):
author = ModelMultipleChoiceField(queryset=Author.objects.all())
class Meta:
model = Book
def __init__(self, letter):
choices = getChoices(letter)
self.author.queryset = choices
che produce lo stesso risultato.
Qualcuno sa come dovrebbe essere fatto?
Sì, la mia vera area problematica ha la chiamata di super classe, ma l'ho saltata per questo esempio. – Brian
Abbastanza giusto. Lascerò tutto questo a chiunque vada in questa domanda per amor di riferimento, immagino. –
Definitivamente. È importante vedere che il super() .__ init __() deve accadere prima dell'accesso ai campi. – Brian