回答:
POSTデータを渡していないので、フォームに表示される初期値が設定されていると想定します。これを行う方法は、initialキーワードを使用することです。
form = CustomForm(initial={'Email': GetEmailString()})
詳細については、Djangoフォームのドキュメントをご覧ください。
フォームの送信後に値を変更する場合は、次のようなものを使用できます。
if form.is_valid():
form.cleaned_data['Email'] = GetEmailString()
使用の詳細については、上記の参照ドキュメントを確認してください cleaned_data
form.data['Email'] = GetEmailString()、それは機能します
form.fields['Email'].initial = GetEmailString() これform.fields['keyword'].initialにより、フォームをインスタンス化した後でも値を初期化するためのアクセスが提供されます
フォームを既に初期化している場合は、フィールドの初期プロパティを使用できます。例えば、
form = CustomForm()
form.fields["Email"].initial = GetEmailString()
__init__何らかの理由でフォームのメソッド内で実行したい場合は、initialdict を操作できます。
class MyForm(forms.Form):
my_field = forms.CharField(max_length=255)
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
self.initial['my_field'] = 'Initial value'
収集した一連のフォームデータのコピーにデータを追加すると、Nigel Cohenのようなものが機能します。
form = FormType(request.POST)
if request.method == "POST":
formcopy = form(request.POST.copy())
formcopy.data['Email'] = GetEmailString()
data[form.add_prefix('Email')]必要がある場合は、おそらく接頭辞が設定されている場合を考慮する必要があります。
form.data = form.data.copy()
modelform_factory。このようにして、不要なフィールドを持たないFormクラスを生成できます。フォームオブジェクトはレンダリングされないフィールドのデータを引き続き受け入れるので、レンダリングされないフィールドを持つFormクラスを持つことは非常に危険です。攻撃者はこれを利用して攻撃者に悪用する可能性があります。
このようなフォームを初期化した場合
form = CustomForm()
その後、2019年1月現在の正しい方法は.initial、データの置き換えに使用することです。これintialにより、フォームに沿った辞書のデータが置き換えられます。次のようなインスタンスを使用して初期化した場合にも機能します form = CustomForm(instance=instance)
フォームのデータを置き換えるには、以下を行う必要があります
form.initial['Email'] = GetEmailString()
これを一般化すると、
form.initial['field_name'] = new_value
Form.dataフィールドを変更するだけです。
class ChooseProjectForm(forms.Form):
project = forms.ModelChoiceField(queryset=project_qs)
my_projects = forms.BooleanField()
def __init__(self, *args, **kwargs):
super(ChooseProjectForm, self).__init__(*args, **kwargs)
self.data = self.data.copy() # IMPORTANT, self.data is immutable
# any condition:
if self.data.get('my_projects'):
my_projects = self.fields['project'].queryset.filter(my=True)
self.fields['project'].queryset = my_projects
self.fields['project'].initial = my_projects.first().pk
self.fields['project'].empty_label = None # disable "-----"
self.data.update(project=my_projects.first().pk) # Update Form data
self.fields['project'].widget = forms.HiddenInput() # Hide if you want
これを行うもう1つの方法は、フォームを(データありまたはなしで)初期化済みであり、フォームを表示する前にさらにデータを追加する必要がある場合です。
form = Form(request.POST.form)
form.data['Email'] = GetEmailString()
ModelChoiceFieldますが、initial値を指定すると、それでもinvalid_choiceを提供しています:(