Django在表单初始化后设置字段值

我正在尝试在表单初始化后将字段设置为某个值。

例如,我有以下class级。

class CustomForm(forms.Form): Email = forms.EmailField(min_length=1, max_length=200) 

在我看来,我希望能够做到这样的事情:

 form = CustomForm() form["Email"] = GetEmailString() return HttpResponse(t.render(c)) 

由于您没有传递POST数据,因此我会假设您要做的是设置一个初始值,将显示在窗体中。 你这样做的方式是与initial关键字。

 form = CustomForm(initial={'Email': GetEmailString()}) 

请参阅Django表单文档以获取更多解释。

如果您在提交表单后尝试更改值,则可以使用以下内容:

 if form.is_valid(): form.cleaned_data['Email'] = GetEmailString() 

请参阅上面的参考文档以获取更多有关使用cleaned_data

如果您已经初始化表单,则可以使用该字段的初始属性。 例如,

 form = CustomForm() form.fields["Email"].initial = GetEmailString() 

如果由于某种原因想要在表单的__init__方法中执行它,则可以操作initial字典:

 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() 

只要改变你的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 

另一种方法是,如果你已经初始化一个表单(有或没有数据),你需要在显示之前添加更多的数据:

 form.data['Email] = GetEmailString()