2011-01-14 2 views
18

voglio sbarazzarsi del "-------------" scelta Django aggiunge in una selezione ingresso che rappresenta una chiave esterna su un ModelFormModelChoiceField, rimuovendo la scelta vuoto

E ' been answered che è possibile utilizzare l'opzione empty_label=none, ma ho un ModelForm, non un modulo regolare e non è consentito sovrascrivere il campo.

So che posso ignorare il metodo della ModelForm __init__() al fine di modificare set di query di un ModelChoiceField utilizzando

self.fields['my_foreign_key'].queryset = .... 

Ma questo sarebbe davvero brutto, come questo accade oltre 10 FOREIGN_KEYS sul "Main" il modello, e non v'è più di un ModelForm basa su questo modello

l'intero contesto:

  • ognuno di questi punti foreign_key allo stesso tipo di modelli: sono elenchi di scelte particolari, molti modelli per facilitare la loro modifica tramite l'amministratore.
  • tutti questi modelli sono correlati al modello Main tramite una relazione "to_field = code", basata su un Charfield che contiene un codice di tre lettere (hey, non è colpa mia, ho dovuto usare un legacy MS Access DB), questo CharField ha le opzioni blank=True, unique=True, così ho potuto, per ciascuna lista, creare un record "---No information yet---" che ha, si scommette, un valore vuoto al posto di un codice di tre lettere ...

La situazione è ora: i get un campo di input selezionato con due scelte "valore vuoto": il django e il mio, uno dopo l'altro. ho solo perdere una '= opzione none` empty_label anche qui ...

+0

penso che si può ridefinire/sovrascrivere il campo. Lo faccio per modificare un campo del modello DateTime in un campo Campo di calcolo (e aggiungere un campo aggiuntivo di DateField). Quindi sovrascrivo il metodo clean() del modulo per combinare i campi data e ora. –

risposta

27

Se si desidera rimuovere la scelta in bianco per tutto ModelChoiceField si potrebbe fare qualcosa di simile ..

class Form(forms.ModelForm): 
    class Meta: 
     model = MyModel 

    def __init__(self, *args, **kwargs): 
     super(Form, self).__init__(*args, **kwargs) 
     modelchoicefields = [field for field_name, field in self.fields.iteritems() if 
      isinstance(field, forms.ModelChoiceField)] 

     for field in modelchoicefield: 
      field.empty_label = None 

Ma che dovrebbe sostituire tutti ModelChoiceField s, quindi forse qualcosa di più a grana fine, come:

for fieldname in ('field1','field2','field3','field4','field5','field6'): 
    self.fields[fieldname].empty_label = None 

certamente più facile che il __init__ sovrascrittura si menzionati!

Aggiornamento da Moritz

È possibile utilizzare 2017+ uso:

forms.ModelChoiceField(... empty_label=None 
+0

Che funziona alla grande Yuji, vorrei poter cliccare dieci volte sulla freccia SU. I ModelForms non sono così chiusi ho pensato dopotutto –

+0

Ehehe, bello! : D –

+0

Ora è possibile effettuare le seguenti operazioni: '' 'forms.ModelChoiceField (... empty_label = None)' '' – Moritz