2009-08-26 12 views

Odpowiedz

71

Jeśli chcesz ustawić domyślną wartość początkową, powinieneś zdefiniować initial podobnie jak inne pola formularza, z wyjątkiem ciebie set it to the id instead.

Say masz field1 tak:

class YourForm(forms.Form): 
    field1 = forms.ModelChoiceField(queryset = MyModel.objects.all()) 

wtedy trzeba ustawić początkowy podczas tworzenia formularza tak:

form = YourForm(initial = {'field1': instance_of_mymodel.pk }) 

zamiast:

form = YourForm(initial = {'field1': instance_of_mymodel }) 

Zakładam również, że zdefiniowałeś dla swoich modeli __unicode__, więc ta dyspozycja prawidłowo się układa.

+0

Nie wiem, jaka wersja była w momencie pisania tego tekstu, ale to pytanie jest teraz nieco przestarzałe. W Django 1.5, na piśmie, obie te metody zadziałają. – JcKelley

+0

jakikolwiek pomysł, dlaczego dostaję '__init __() ma nieoczekiwany argument argumentu ze słowem kluczowym field1' – dashesy

14

można po prostu użyć

field1 = forms.ModelChoiceField(queryset=..., initial=0) 

aby pierwsza wartość wybranej itd. Jest to bardziej ogólny sposób, a następnie drugą odpowiedź.

+2

W jakiej wersji Django to działa?Wydaje mi się, że nie działa to dla mnie w wersji 1.8. – BudgieInWA

+0

Mam zweryfikowane z [kodu źródłowego] (https://github.com/django/django/blob/1.8.11/django/forms/models.py#L1127-L1130) i przetestuj go samodzielnie, że to działa dla 'django> = 1.8'. Wierzę, że powinno to działać we wszystkich wersjach, w tym '> = 1.4' – Yeo

6

Czasy uległy one zmianie:

Domyślna wartość początkowa może być ustawiony poprzez zdefiniowanie initial jak innych pól formularza wyjątkiem ustawić go id zamiast.

Teraz będzie to wystarczyć:

form = YourForm(initial = {'field1': instance_of_mymodel }) 

Choć obie nadal działać.

+6

Proszę określić, którą wersję Django używasz teraz, gdy" czasy się zmieniły ". Zmieniono niektóre z nich na upgrade do wersji 1.2 ... – scoopseven

-1

Można to zrobić również:

form = YourForm(initial = {'field1': pk }) 

jeśli parsowania swój podstawowy klucz poprzez ciąg kwerendy lub za pośrednictwem wywołania AJAX bez potrzeby instancji, zbiór rekordów już obchodzić, że do spadku w dół, indeksy pk stan chcesz

1

Kod

form = YourForm(initial = {'field1': instance_of_mymodel.pk }) 

i

form = YourForm(initial = {'field1': instance_of_mymodel }) 

lub początkowe pole bezpośrednio następujący:

field1 = forms.ModelChoiceField(queryset=..., initial=0) 

Wszystkie prace.

Pierwsze dwa sposoby zastąpią ostateczny sposób.

Powiązane problemy