2011-11-28 180 views
0

我碰到一个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) 

如果我改变了 “超级” 行这样的:

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 

即使wierder,Django的跟踪输出给了我这样的:

Checkpoint A 
Checkpoint B 

在返回HTTP 500错误之前。

据我所知,NewBatchForm中save方法中的超级行从不调用CreateSharedObjectForm。我知道super method can be tricky,但这只是单一的继承,我不知道为什么超类从未调用的方法。

这是怎么回事?我如何解决它?

回答

1

你确定你不想super(NewBatchForm, self).save里面NewBatchForm

(你有super(CreateSharedObjectForm, self)

+0

我尝试过了,它抛出:保存()有多个值的关键字参数“提交” – Abe

+0

感谢好了,快回答我无法相信我错过了我自己。 – Abe