Django模型表单继承

0 投票
1 回答
510 浏览
提问于 2025-04-17 07:16

我遇到了一个django的错误,搞得我头都疼。背景是:我有一组模型相互继承,我想建立一组结构相似的表单。

这是一个用于创建对象的表单的基本类型:

class CreateSharedObjectForm(ModelForm): 
  def save(self, status, object_type, commit=True, *args, **kwargs):
    print "*********Got here!!!**************"
    shared_object = super(ModelForm,self).save( commit=False, *args, **kwargs)
    shared_object.status = status
    shared_object.object_type = object_type

    if commit:
      shared_object.save()
    return shared_object

这是一个继承的表单类型:

class NewBatchForm(CreateSharedObjectForm):
  def save(self, status, object_type, batch_options, commit=True, *args, **kwargs):
    print "Checkpoint A"
    batch = super(CreateSharedObjectForm,self).save( status, object_type, commit=False, *args, **kwargs )
    print "Checkpoint B"

    if commit:
      batch.save(*args, **kwargs)
    return analysis

  class Meta:
    model = batch

我在一个视图脚本中调用这个继承的类型:

 form = NewAnalysisForm(request.POST, request.FILES)
  new_analysis = form.save(
    status = 'X',
    object_type  = 'Batch',
    batch_type = 'temp',
  )

结果出现了这个错误:

save() takes at most 2 non-keyword arguments (4 given)

如果我把“super”这一行改成这样:

batch = super(CreateSharedObjectForm,self).save( status, object_type, commit=False, *args, **kwargs )

我就会得到这个错误:

Exception Type:     IntegrityError
Exception Value:    null value in column "parent_project_id" violates not-null constraint

更奇怪的是,django的错误追踪输出给了我这个:

Checkpoint A
Checkpoint B

然后返回了一个HTTP 500错误。

根据我的观察,NewBatchForm中的save方法里的super这一行从来没有调用CreateSharedObjectForm。我知道super方法可能会很棘手,但这只是单一继承,我搞不明白为什么父类的方法从来没有被调用。

这是怎么回事呢?我该怎么解决这个问题?

1 个回答

1

你确定不想在 NewBatchForm 里面加上 super(NewBatchForm, self).save 吗?

(你现在有 super(CreateSharedObjectForm, self)

撰写回答