初始化窗体后,Django 设置字段值

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

例如,我有以下类。

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

在视图中,我希望能够做这样的事情:

form = CustomForm()
form["Email"] = GetEmailString()


return HttpResponse(t.render(c))
179724 次浏览

因为您没有传递 POST 数据,所以我假设您要做的是设置一个将在表单中显示的初始值。方法是使用 initial关键字。

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

有关详细说明,请参阅 姜戈表格文件

如果您试图在表单提交后更改值,您可以使用以下命令:

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

查看上面引用的文档以获得更多关于使用 cleaned_data的信息

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

form = Form(request.POST.form)
form.data['Email'] = GetEmailString()

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

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

如果你把收集到的表单数据添加到 收到中,类似 Nigel Cohen 的方法是可行的:

form = FormType(request.POST)
if request.method == "POST":
formcopy = form(request.POST.copy())
formcopy.data['Email'] = 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'

只需更改 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

再加上另一种方式: 这种方法也可行,使用的符号更加现代一些。它只是围绕着 QueryDict是不可变的这一事实工作。

>>> the_form.data = {**f.data.dict(), 'some_field': 47}
>>> the_form['some_field'].as_widget()
'<input type="hidden" name="some_field" value="47"
class="field-some_field" id="id_some_field">'

如果您像这样初始化了表单

form = CustomForm()

那么正确的方法就是使用 .initial来替换数据。这将替换与表单一起使用的 intial结构中的数据。如果您使用某些实例(如 form = CustomForm(instance=instance))进行了初始化,那么它也可以工作

要替换表单中的数据,您需要

form.initial['Email'] = GetEmailString()

一般来说,

form.initial['field_name'] = new_value

在小部件中使用“ value”attr。 例如:

username = forms.CharField(
required=False,
widget=forms.TextInput(attrs={'readonly': True, 'value': 'CONSTANT_VALUE'}),
)