Django formlarında seçilen değeri ayarlama.


108

İşte bir formdaki alan bildirimi:

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

Başlangıç ​​değerini şu şekilde ayarlamak istiyorum 3 ve bu işe yaramıyor. Param, alıntılar / alıntı yok, vb. İle oynadım ama değişiklik yok.

Mümkünse, biri bana kesin bir cevap verebilir mi? Ve / veya kod pasajımda gerekli ayarlamalar?

Django 1.0 kullanıyorum


Ben de aynı şeyi merak ediyorum. "ilk", en son gövde sürümündeki seçeneklerle çalışmak için dikiş atmaz.
Ty.

Yanıtlar:


115

Formu başlatırken başlangıç ​​değerini ayarlamayı deneyin:

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

3
Mi '3'tuple veya ikinci ilk değerine karşılık gelen?
Bestasttung

5
demetler, seçenekler için (değer, etiket) çiftlerini temsil eder ve başlangıç ​​değerini belirtmek istersiniz - bu nedenle '3' ilk öğeyi ifade eder.
Tom

95

Bu, eldeki acil soruya değinmez, ancak bu Soru / Cevap, seçilen değeri a'ya atamaya çalışmakla ilgili aramalar için ortaya çıkar ChoiceField.

super().__init__Form sınıfınızı zaten çağırdıysanız form.initial, field.initialözelliği değil sözlüğü güncellemelisiniz . Çalışırsanız form.initial(örneğin print self.initial, çağrıldıktan sonra super().__init__), tüm alanlar için değerler içerecektir . Bu diktede bir değere sahip olmak, değeri Nonegeçersiz kılacaktır field.initial.

Örneğin

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'

3
Bu yanıtı anlamak yoksa, bu okuma Django formu FRİKİKLERİNDEN
ChillarAnand

1
Bu cevabın artık işe yaramayacak kadar eski olduğundan emin değilim, ancak bu çözümü işe yarayamıyorum. Yukarıdakilerin her kombinasyonunu denedim ve hala hiç sevmiyorum. Bu soruyu burada tekrar sordum: stackoverflow.com/questions/52191096/… Cevap hala aynıysa, lütfen kodumda neyin yanlış olduğunu bana bildirin. Teşekkür ederim!
Lehrian

48

Aşağıdakileri de yapabilirsiniz. formunuzda sınıf def:

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

daha sonra görünümünüzdeki formu çağırırken hem ilk tercihleri ​​hem de seçim listesini dinamik olarak ayarlayabilirsiniz.

yourFormInstance = YourFormClass()

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

Not: İlk değerler bir liste olmalı ve seçenekler 2-tupl olmalıdır, yukarıdaki örneğimde 2-tuple listem var. Bu yardımcı olur umarım.


5
Belki de değerinin initial, dizini değil, seçilecek öğenin anahtarına atıfta bulunduğunu belirtmek gerekir. Bunu halletmek için birkaç deneme yaptım!
BigglesZX

20

Ben de bu problemle karşılaştım ve sorunun tarayıcıda olduğunu anladım. Tarayıcı yenilediğinizde, işaretli alanı yok sayarak formu öncekiyle aynı değerlerle yeniden dolduruyor. Kaynağı görüntülerseniz, kontrol edilen değerin doğru olduğunu görürsünüz. Veya imlecinizi tarayıcınızın URL alanına getirin ve enter tuşuna basın. Bu, formu sıfırdan yeniden yükleyecektir.


1
sadece fyi, Bu hala FF6'da oluyor. Yenileme düğmesine basmak yeterli değildir. Ancak google chrome yenileme düğmesi yeterli, adres çubuğuna gitmeye gerek yok
mhd

1
Bunun her zaman Firefox'ta olacağını düşünüyorum; amaçlanan davranış.
thepeer

Hala Chrome 83'te oluyor, hayatımı kurtardın dostum!
lapin

7

Hem Tom hem de Burton'ın cevapları sonunda benim için işe yarıyor, ancak bunları a ModelChoiceField.

Tek hile, seçimlerin demetleri olarak saklanmasıdır (<model's ID>, <model's unicode repr>), bu nedenle ilk model seçimini ayarlamak istiyorsanız, modelin kimliğini başlangıç ​​değeri olarak iletirsiniz , nesnenin kendisi veya adı veya başka bir şey değil. O zaman şu kadar basit:

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

Alternatif olarak, initialargüman ekstra bir satır yerine göz ardı edilebilir:

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

1
İkinci kod satırınız, bir GETtalepten sonra bir formun başlangıç ​​değerini ayarlamanız ve onu bir görünümden ayarlamanız gereken ender durumlarda kusursuz bir şekilde çalışır .
kstratis

3

Dave - tarayıcı sorununa bir çözüm bulma şansınız var mı? Yenilemeye zorlamanın bir yolu var mı?

Orijinal soruna gelince, formu başlatırken aşağıdakileri deneyin:

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

1
Bu pek hoş görünmüyor. Django 1.3'ten alıntı, forms.py:93:Instances should always modify self.fields; they should not modify self.base_fields.
Tomas Tomecek

1

Emin olmak için formu nasıl oluşturduğunuzu görmem gerekiyor. Başlangıç ​​değeri yalnızca ilişkisiz bir biçimde kullanılır; bağlıysa ve bu alan için bir değer dahil edilmediyse hiçbir şey seçilmez.


-4

Bunu dene, benim için çalışıyor, bunu models.py'ye ekledim

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

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

6
Bu django TypeError at /my/url/ __init__() got an unexpected keyword argument 'default' Request Method: GET Request URL: http://localhost:8000/my/url/ Django Version: 1.8.1 Exception Type: TypeError Exception Value: __init__() got an unexpected keyword argument 'default'
1.8.1'de
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.