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