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

时间:2009-05-01 21:39:47

标签: django

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

例如,我有以下课程。

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

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

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

return HttpResponse(t.render(c))

8 个答案:

答案 0 :(得分:119)

由于你没有传递POST数据,我假设你要做的是设置一个将在表单中显示的初始值。这样做的方法是使用initial关键字。

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

有关详细说明,请参阅Django Form docs

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

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

查看上面引用的文档,了解有关使用cleaned_data

的更多信息

答案 1 :(得分:85)

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

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

答案 2 :(得分:7)

如果您要将数据添加到收集的表单数据集的副本中,那么像Nigel Cohen这样的东西会起作用:

form = FormType(request.POST)
if request.method == "POST":
    formcopy = form(request.POST.copy())
    formcopy.data['Email'] = GetEmailString()

答案 3 :(得分:2)

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

答案 4 :(得分:0)

再加入另一种方式:这也可以用更现代的符号表示。它只是解决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">'

答案 5 :(得分:0)

如果您已经初始化了这样的表单

form = CustomForm()

那么从 2019年1月开始,正确的方法是使用.initial替换数据。这将替换表格中intial字典中的数据。如果您使用form = CustomForm(instance=instance)

之类的实例进行了初始化,它也将起作用

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

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

将其概括化,

form.initial['field_name'] = new_value

答案 6 :(得分:0)

小部件中的

使用“值”属性。 示例:

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

答案 7 :(得分:-12)

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

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