Джанго модельформ наследования - PullRequest
0 голосов
/ 29 ноября 2011

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

Что здесь происходит?Как мне это исправить?

1 Ответ

1 голос
/ 29 ноября 2011

вы уверены, что не хотите super(NewBatchForm, self).save внутри NewBatchForm?

(у вас есть super(CreateSharedObjectForm, self)

...