Djangoフォームで選択した値を設定します。ChoiceField


106

これはフォームのフィールド宣言です:

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

初期値をに設定したいの3ですが、うまくいきません。私はparam、quotes / no quotesなどで遊んでみましたが、変更はありません

可能であれば、誰かが私に決定的な答えを与えることができますか?および/または私のコードスニペットで必要な微調整?

Django 1.0を使用しています


私も同じことを考えていました。「initial」は、最新のトランクバージョンの選択肢でも動作しません。
タイ。

回答:


114

フォームをインスタンス化するときに初期値を設定してみてください:

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

3
された'3'タプルまたは第二の最初の値に対応しますか?
Bestasttung 2017年

4
タプルはオプションの(値、ラベル)ペアを表し、初期値を指定する必要があるため、「3」は最初の項目を指します。
トム

95

これは当面の質問には触れませんが、このQ / Aは、選択した値をに割り当てようとすることに関連する検索で表示されますChoiceField

super().__init__Formクラスですでに呼び出している場合form.initialは、field.initialプロパティではなくディクショナリを更新する必要があります。学習した場合form.initial(たとえばprint self.initialの呼び出し後super().__init__)、すべてのフィールドの値が含まれます。値を持つNoneことのdictには上書きされますfield.initial値を。

例えば

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
あなたはこの答えを理解していない場合は、この読みDjangoのフォームの落とし穴
ChillarAnand

1
この回答が古すぎて機能しなくなったためかどうかはわかりませんが、このソリューションを機能させることができません。私は上記のすべての組み合わせを試しましたが、それでも愛情はありません。私はここでもう一度この質問をしました:stackoverflow.com/questions/52191096/… 答えが同じである場合は、私のコードの問題を教えてください。ありがとうございました!
Lehrian 2018

48

次のこともできます。あなたのフォームクラスのdefで:

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

次に、ビューでフォームを呼び出すときに、最初の選択肢と選択肢リストの両方を動的に設定できます。

yourFormInstance = YourFormClass()

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

注:初期値はリストでなければならず、選択肢は2タプルでなければなりません。上の例では、2タプルのリストがあります。お役に立てれば。


5
おそらく、の値はinitial、インデックスではなく、選択されるアイテムのキーを参照することに注意してください。これを解決するために数回試してみました!
BigglesZX 2014年

20

私もこの問題に遭遇し、ブラウザに問題があることがわかりました。ブラウザを更新すると、チェック済みのフィールドは無視され、以前と同じ値がフォームに再入力されます。ソースを表示すると、チェックした値が正しいことがわかります。または、ブラウザのURLフィールドにカーソルを置き、Enterキーを押します。これにより、フォームが最初から再ロードされます。


1
ただファイ、これはまだFF6で起こります。更新ボタンを押すだけでは不十分です。しかし、Google
Chrome

1
私はそれが常にFirefoxで起こると思います。それは意図された動作です。
ピアは

それでもChrome 83で起こります、あなたは私の命を救ったのです!
ラパン

7

トムとバートンの両方の答えが最終的に私には有効ですが、それらをに適用する方法を理解するのに少し苦労しましたModelChoiceField

唯一のトリックは、選択肢がのタプルとして格納される(<model's ID>, <model's unicode repr>)ことです。そのため、初期モデル選択を設定する場合は、オブジェクト自体や名前などではなく、モデルのIDを初期値として渡します。次に、それは次のように簡単です:

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

または、次initialのように追加の行の代わりに引数を無視できます。

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

1
コードの2行目は、GETリクエスト後にフォームの初期値を設定し、ビュー内から設定する必要があるまれなケースの1つで問題なく機能します。
kstratis 14

3

デイブ-ブラウザーの問題の解決策を見つける幸運はありますか?強制的に更新する方法はありますか?

元の問題については、フォームを初期化するときに次のことを試してください。

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

1
これは見栄えがよくありません。django 1.3から引用、forms.py:93:Instances should always modify self.fields; they should not modify self.base_fields.
Tomas Tomecek

1

確かに、フォームのレンダリング方法を確認する必要があります。初期値は、バインドされていないフォームでのみ使用されます。バインドされていて、そのフィールドの値が含まれていない場合、何も選択されません。


-4

これを試してみてください、私にとってはうまくいきます。models.pyに追加しました

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

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

6
これは、Djangoの1.8.1でエラーを与える: 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'
ジュリオ・セザル・ソアレス・エスピンドラ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.