Answers:
由于您没有传递POST数据,因此我假设您要尝试设置的初始值将显示在表单中。执行此操作的方法是使用initial
关键字。
form = CustomForm(initial={'Email': GetEmailString()})
请参阅Django Form文档更多说明,。
如果您在提交表单后尝试更改值,则可以使用以下方法:
if form.is_valid():
form.cleaned_data['Email'] = GetEmailString()
检查上面引用的文档以获取更多有关使用的信息 cleaned_data
form.data['Email'] = GetEmailString()
并且可以正常工作
form.fields['Email'].initial = GetEmailString()
该form.fields['keyword'].initial
给你访问甚至有实例化表单后,初始化自己的价值观
如果已经初始化了表单,则可以使用该字段的initial属性。例如,
form = CustomForm()
form.fields["Email"].initial = GetEmailString()
如果__init__
出于某种原因要在表单的方法中进行操作,则可以操作initial
dict:
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对象仍然会接受非渲染字段的数据。攻击者可以利用此优势。
只需更改您的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
在小部件中使用“值”属性。例:
username = forms.CharField(
required=False,
widget=forms.TextInput(attrs={'readonly': True, 'value': 'CONSTANT_VALUE'}),
)
另一种方法是,如果您已经初始化了一个表单(有或没有数据),并且需要在显示之前添加更多数据:
form = Form(request.POST.form)
form.data['Email'] = GetEmailString()
ModelChoiceField
当我给它一个initial
值时,我仍然在提供invalid_choice :(