web-dev-qa-db-ja.com

Django forms.ChoiceFieldで選択した値を設定する

フォーム内のフィールド宣言は次のとおりです。

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を使用しています

105
thebiglife

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

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

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

Formクラスで既にsuper().__init__を呼び出している場合は、form.initialプロパティではなく、field.initial辞書を更新する必要があります。 form.initial(たとえば、super().__init__の呼び出し後のprint self.initial)を学習する場合、allフィールドの値が含まれます。その辞書にNoneの値があると、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'
85
colinta

次のこともできます。フォームクラス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タプルのリストがあります。お役に立てれば。

39
Burton Williams

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

18
Dave

トムとバートンの両方の答えは最終的にはうまくいきますが、それらを ModelChoiceField に適用する方法を見つけるのに少し苦労しました。

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

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

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

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

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

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

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

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

1