Я столкнулся с ошибкой 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 никогда не вызывает CreateSharedObjectForm.Я знаю, что метод super может быть хитрым , но это всего лишь одиночное наследование, и я не могу понять, почему метод для суперкласса никогда не вызывается.
Что здесь происходит?Как мне это исправить?