在保存数据之前将数据添加到Django表单吗?

Ale*_*xis 5 django django-models django-forms django-views

在这个简化的用例中,我有一个Django表单,其中包含MyField_1和MyField_2。用户填写MyField_1。在将表单另存为模型之前,我希望计算机以MyField_2编程方式添加从其他数据源提取的一些数据。我目前拥有的视图如下所示:

class MyCreate(CreateView):
    model = MyModel
    fields = ['MyField_1']
Run Code Online (Sandbox Code Playgroud)

MyField_2保存模型之前如何添加数据?

Piy*_*rya 8

您可以通过以下方式执行此操作(请参阅基于类的视图的第二个示例):

if request.method == 'POST':
    form = Form(request.POST)
    if form.is_valid():
        instance = form.save(commit=False)
        instance.my_field_2 = #Put value here
        instance.save()
        return #Put return here
else:
    form = Form()
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以初始化任何值以形成用户不输入的形式。

在基于类中,CreateView您可以通过以下form_valid方式覆盖方法:

def form_valid(self, form):
    form.instance.field_2 = # Put value here
    return super(YourCreateView, self).form_valid(form)
Run Code Online (Sandbox Code Playgroud)


Ser*_*eim 7

有多种方法可以做到这一点(例如,重写ModelForm.save()方法),但是我建议您重写ModelFormMixin.form_valid()方法。所以像这样改变你的看法:

class MyCreate(CreateView):
  model = MyModel
  fields = ['MyField_1']

  def form_valid(self, form):
    self.object = form.save(commit=False)
    self.object.MyField_2 = 43
    self.object.save()
    return super(ModelFormMixin, self).form_valid(form)
Run Code Online (Sandbox Code Playgroud)

两个建议:

  • 正如@PiyushMaurya解释的那样,form.save(commit = False)将仅返回Model的实例,而不保存到数据库。如果在没有commit = False的情况下运行form.save(),则该对象将保存到数据库中,并且如果未通过表单填写必填字段,则将获得异常。如果不运行form.save(...),您将没有对表单应创建的对象的引用。这就是为form_valid传递form变量的原因,以便您可以从那里插入对象。 (2认同)