Чтобы настроить сохранение инлайнов, вы можете переопределить FormSet
class SomeInlineFormSet(BaseInlineFormSet):
def save_new(self, form, commit=True):
return super(SomeInlineFormSet, self).save_new(form, commit=commit)
def save_existing(self, form, instance, commit=True):
return form.save(commit=commit)
class SomeInline(admin.StackedInline):
formset = SomeInlineFormSet
# ....
Обратите внимание, что save_new()
использует только форму, чтобы получить данные, он не позволяет ModelForm
фиксации данных. Вместо этого он строит сама модель. Это позволяет вставить родительское отношение, так как они не существуют в форме. Вот почему переопределение form.save()
не работает.
В случае родовых инлайн, метод form.save()
никогда не вызываются, и form.cleaned_data
используются вместо того, чтобы получить все значения, и Field.save_form_data()
используются для хранения значений в экземпляре модели.
FYI, некоторые общие советы, чтобы изобразить эти вещи; очень полезно иметь IDE (или, возможно, конфигурацию vim или Sublime setup), что позволяет легко перейти к символьным определениям. Вышеприведенный код был вычислен, введя код inline/formet и посмотрев, что происходит. В случае с PyCharm, который работает, удерживая Command (или Ctrl) и нажимая на символ. Если вы пользователь vim, ctags
может сделать для вас подобную вещь.
+1 Для указания, что лучше переопределить метод 'save()' на модели! – Caumons