Django模型表单继承
我遇到了一个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)
)