フォーム内のフィールド宣言は次のとおりです。
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を使用しています
フォームをインスタンス化するときに初期値を設定してみてください。
form = MyForm(initial={'max_number': '3'})
これは目前の質問には触れませんが、選択した値を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'
次のこともできます。フォームクラス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タプルのリストがあります。お役に立てれば。
私もこの問題に遭遇し、問題がブラウザーにあることがわかりました。ブラウザを更新すると、チェックされたフィールドを無視して、以前と同じ値がフォームに再入力されます。ソースを表示すると、チェックされた値が正しいことがわかります。または、ブラウザのURLフィールドにカーソルを置き、Enterキーを押します。これにより、フォームが最初から再ロードされます。
トムとバートンの両方の答えは最終的にはうまくいきますが、それらを 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
デイブ-ブラウザの問題の解決策を見つける運はありますか?強制的に更新する方法はありますか?
元の問題については、フォームを初期化するときに次のことを試してください。
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
self.base_fields['MyChoiceField'].initial = initial_value
フォームをどのようにレンダリングしているかを確認する必要があります。初期値は、バインドされており、そのフィールドの値が含まれていない場合、何も選択されない場合にのみ、非バインドフォームで使用されます。