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

Eld*_*ila 105 django

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

例如,我有以下课程.

class CustomForm(forms.Form):
    Email = forms.EmailField(min_length=1, max_length=200)
Run Code Online (Sandbox Code Playgroud)

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

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

return HttpResponse(t.render(c))
Run Code Online (Sandbox Code Playgroud)

Gra*_*ant 123

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

form = CustomForm(initial={'Email': GetEmailString()})
Run Code Online (Sandbox Code Playgroud)

有关更多说明,请参阅Django表单文档.

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

if form.is_valid():
    form.cleaned_data['Email'] = GetEmailString()
Run Code Online (Sandbox Code Playgroud)

有关使用的更多信息,请查看上面引用的文档 cleaned_data

  • 这不起作用,`form.as_p()`仍然输出旧数据. (4认同)
  • 这个问题的正确解决方案应该是: `form.fields['Email'].initial = GetEmailString()` 即使在实例化之后,`form.fields['keyword'].initial` 也使您可以访问初始化值你的表格 (4认同)
  • 这证实了我所知道的,但是当我给它一个 `initial` 值时,我的 `ModelChoiceField` 仍然给出了 invalid_choice :( (2认同)
  • 我将我的更改为`form.data ['Email'] = GetEmailString()`,它可以正常工作 (2认同)

Jos*_*osh 88

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

form = CustomForm()
form.fields["Email"].initial = GetEmailString()
Run Code Online (Sandbox Code Playgroud)

  • 正确的方法是form.initial ["Email"] = GetEmailString() (7认同)
  • 有没有不同的方法来做到这一点是Django 1.7/Python 3.4?这不适合我 (5认同)
  • @JeremyCraigMartinez:不...您正在尝试的表单是绑定表单(传入 GET/POST 数据)吗?文档说_这就是为什么仅针对未绑定表单显示初始值的原因。对于绑定表单,HTML 输出将使用绑定数据。_,请参阅[此处](https://docs.djangoproject.com/en/1.8/ref/forms/fields/#initial) (3认同)

sed*_*nym 9

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

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'
Run Code Online (Sandbox Code Playgroud)


Vin*_*Sai 8

如果你已经像这样初始化了表单

form = CustomForm()
Run Code Online (Sandbox Code Playgroud)

那么截至2019 年 1 月的正确方法是使用.initial替换数据。这将替换intial与表单一起使用的字典中的数据。如果您使用某些实例进行初始化,它也可以工作,例如 form = CustomForm(instance=instance)

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

form.initial['Email'] = GetEmailString()
Run Code Online (Sandbox Code Playgroud)

概括这将是,

form.initial['field_name'] = new_value
Run Code Online (Sandbox Code Playgroud)


Mil*_*ica 7

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

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

  • 我不太喜欢重写原始数据。如果您绝对必须这样做,您可能应该执行“data[form.add_prefix('Email')]”来考虑设置前缀的情况。 (2认同)
  • 有没有不同的方法来做到这一点是Django 1.7/Python 3.4?这不适合我 (2认同)
  • 如果不需要保留原始形式,第三行可以短一点:`form.data = form.data.copy()` (2认同)

小智 6

只需更改您的 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
Run Code Online (Sandbox Code Playgroud)