2011-01-14 13 views
18

Chcę pozbyć się „-------------” Choice Django dodaje w wybranej wejścia reprezentującej klucz obcy na ModelFormModelChoiceField, usuwając puste wybór

Nadszedł been answered, można użyć opcji empty_label=none, ale mam ModelForm, a nie zwykłą formę i nadpisanie pola jest niedozwolone.

wiem, że mogę zastąpić metodę z ModelForm __init__() w celu zmodyfikowania queryset danej ModelChoiceField Korzystanie

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

Ale to byłoby naprawdę brzydki, jak to się dzieje ponad +10 foreign_keys na „głównej” model i nie więcej niż ModelForm oparte na tym modelu

cały kontekst:

  • każdy z tych punktów foreign_key do tego samego rodzaje modeli: są to konkretne listy wyborów, wiele modeli ułatwia ich modyfikację za pośrednictwem administratora.
  • wszystkie te modele są powiązane z Modelem głównym za pomocą relacji "to_field = code", na podstawie Charfielda, który zawiera trzyliterowy kod (hej, nie moja wina, musiałem użyć starszego MS Access DB), to Charfield ma opcje blank=True, unique=True, więc mogłem, dla każdej listy, utworzyć "---No information yet---" rekord, który ma, to zakład, pustą wartość zamiast trzyliterowy kod ...

sytuacja jest teraz: mam wybrane pole wejściowe z dwoma opcjami "pustej wartości": django i moje, jedna po drugiej. prostu przegapić „empty_label = opcję none` tutaj też ...

+0

myślę, że można przedefiniować/nadpisać pole. Robię to, aby zmienić pole modelu DateTime na formularz TimeField (i dodać dodatkowe pole DateField). Następnie przesłonię metodę clean() formularza, aby połączyć pola daty i godziny. –

Odpowiedz

27

Jeśli chcesz usunąć puste wyborem dla wszystkich ModelChoiceField można zrobić coś takiego ..

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 

Ale to by zastąpić wszystkie ModelChoiceField s, więc może coś bardziej drobnoziarnista jak:

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

z pewnością łatwiejsze niż __init__ nadpisanie wspomniałeś!

Aktualizacja z Moritz

Można użyć 2017+ używać:

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

To działa świetnie, Yuji, chciałbym móc kliknąć dziesięć razy na strzałkę w górę. ModelForms nie są tak zamknięte, pomyślałem przecież –

+0

Ehehe, miło! : D –

+0

Możesz teraz wykonać następujące czynności: '' 'forms.ModelChoiceField (... empty_label = None)' '' – Moritz

Powiązane problemy