2009-03-18 17 views
83

Oto deklaracja pola w formularzu:Ustawianie wybranej wartości na Django forms.ChoiceField

max_number = forms.ChoiceField(widget = forms.Select(), 
        choices = ([('1','1'), ('2','2'),('3','3'), ]), initial='3', required = True,) 

Chciałbym ustawić wartość początkową za 3 i to nie wydają się działać. Grałem z param, cytatów/bez cytatów itp ... ale bez zmian.

Kilka wyników znalezionych przez Google sugeruje, że możliwe jest ustawienie wartości początkowej, ale nigdy nie udało mi się jej uruchomić! Jestem na Django 1.0 przy okazji.

Czy ktoś mógłby udzielić mi ostatecznej odpowiedzi, jeśli jest to możliwe? I/lub niezbędne modyfikacje w moim fragmencie kodu?

Wielkie dzięki.

+0

Zastanawiałem samo. "initial" nie nadaje się do pracy z wyborami w najnowszej wersji trunk. –

Odpowiedz

87

Spróbuj ustawić wartość początkową, jeśli instancję postać:

form = MyForm(initial={'max_number': '3'}) 
+0

Czy '' ''3''' odpowiada pierwszej wartości krotki lub sekundy? – Bestasttung

+1

krotki reprezentują pary (wartości, etykiety) dla opcji i chcesz określić wartość początkową - więc "3" odnosi się do pierwszego elementu. – Tom

1

Na pewno muszę zobaczyć, jak renderujesz formularz. Wartość początkowa jest używana tylko w formie niezwiązanej, jeśli jest powiązana, a wartość dla tego pola nie jest włączona, nic nie zostanie wybrane.

17

wpadłem na ten problem, jak również i zorientowali się, że problem jest w przeglądarce. Po odświeżeniu przeglądarki ponownie wypełnia formularz z tymi samymi wartościami, co wcześniej, ignorując zaznaczone pole. Jeśli wyświetlisz źródło, zobaczysz, że zaznaczona wartość jest poprawna. Lub umieść kursor w polu adresu URL przeglądarki i naciśnij enter. To spowoduje ponowne załadowanie formularza od zera.

+1

po prostu fyi, To nadal się zdarza w FF6. Naciśnięcie przycisku odświeżania nie wystarczy. Ale w Google Chrome przycisk odświeżania wystarczy, nie trzeba iść do paska adresu – mhd

+1

Myślę, że zawsze będzie się działo w Firefoksie; to zamierzone zachowanie. – thepeer

3

Dave - na szczęście znalazłeś rozwiązanie problemu z przeglądarką? Czy istnieje sposób na wymuszenie odświeżenia?

Co do pierwotnego problemu, spróbuj wykonać następujące czynności podczas inicjalizacji formularza:

def __init__(self, *args, **kwargs): 
    super(MyForm, self).__init__(*args, **kwargs) 
    self.base_fields['MyChoiceField'].initial = initial_value 
+1

To nie wygląda ładnie. Cytowane z django 1.3, forms.py:93: 'Wystąpienia powinny zawsze modyfikować self.fields; nie powinny modyfikować self.base_fields. " – SummerBreeze

37

Można również wykonać następujące czynności. w swojej klasie formularza klasa:

max_number = forms.ChoiceField(widget = forms.Select(), 
       choices = ([('1','1'), ('2','2'),('3','3'), ]), initial='3', required = True,) 

następnie podczas wywoływania formularza w widoku można dynamicznie ustawiać zarówno początkowe wybory, jak i listę wyboru.

yourFormInstance = YourFormClass() 

yourFormInstance.fields['max_number'].choices = [(1,1),(2,2),(3,3)] 
yourFormInstance.fields['max_number'].initial = [1] 

Uwaga: wartości początkowe musi mieć listę i wybór musi być 2-krotki, w moim przykładzie powyżej Mam listę 2-krotek. Mam nadzieję że to pomoże.

+3

Warto zauważyć, że wartość" initial "odnosi się do klucza wybranego elementu, a nie do jego indeksu. Zajęło mi kilka prób, aby to rozwiązać! – BigglesZX

5

Odpowiedzi Tom i Burtona działają dla mnie w końcu, ale miałem małe problemy z ustaleniem, jak zastosować je do ModelChoiceField.

Jedyny trick jest to, że wybory są przechowywane jako krotek (<model's ID>, <model's unicode repr>), więc jeśli chcesz, aby ustawić początkowy wybór modelu, mijamy modelu ID jako wartości początkowej, a nie sam obiekt lub jego nazwę albo coś innego.Wtedy to tak proste, jak:

form = EmployeeForm(initial={'manager': manager_employee_id}) 

Alternatywnie initial argument może być ignorowane w miejsce z dodatkową linię z:

form.fields['manager'].initial = manager_employee_id 
+1

Twoja druga linia kodu działa bezbłędnie w jednym z tych rzadkich przypadków, w których musisz ustawić wartość początkową formularza po żądaniu "GET" i ustawić je w widoku. – kstratis

60

nie dotykać na bezpośrednim pytaniu pod ręką, ale to Q/A pojawia się wyszukiwanie związane z próbą przypisania wybranej wartości do ChoiceField.

Jeśli już masz na swoim formularzu nazwę super().__init__, powinieneś zaktualizować słownik form.initial, a nie właściwość field.initial. Jeśli będziesz studiować form.initial (np. print self.initial po połączeniu z super().__init__), będzie zawierał wartości dla wszystkich pól. Wartość None w tym dictrze zastąpi wartość field.initial.

np.

class MyForm(forms.Form): 
    def __init__(self, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs) 
     # assign a (computed, I assume) default value to the choice field 
     self.initial['choices_field_name'] = 'default value' 
     # you should NOT do this: 
     self.fields['choices_field_name'].initial = 'default value' 
+1

Dzięki. Jak powiedziałeś, nie jest to dokładnie związane z OP, ale rozwiązało problem, którego szukałem. – randlet

+0

Dzięki za to, uratowałeś mnie od odrobiny drapania głowy! – TimD

+2

jeśli nie rozumiesz tej odpowiedzi, przeczytaj ten artykuł [django form gotchas] (http://www.avilpage.com/2015/03/django-form-gotchas-dynamic-initial.html) – ChillarAnand

-2

Spróbuj tego, że pracuje dla mnie, ja dodałem to w models.py

options = (
    ('1','1'), 
    ('2','2'), 
    ('3','3') 
) 

max_number = forms.ChoiceField(max_length = 2, choices = options, default ='3') 
+5

To daje błąd w Django 1.8.1: 'TypeError AT/mojego/url/ __init __() dostał nieoczekiwaną argumentu słowa kluczowego 'default' Zapytanie Metoda: \t GET URL żądania: \t http: // localhost: 8000/my/url/ Django wersja: \t 1.8.1 Wyjątek Typ: \t TypeError Wyjątek Wartość: \t __init __() dostał nieoczekiwaną kluczowego argumentu „default'' – juliocesar

Powiązane problemy