para personalizar el ahorro de inlines, puede anular la 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
# ....
Tenga en cuenta que la save_new()
sólo utiliza el formulario para obtener los datos, que no permite que el ModelForm
cometen los datos. En cambio, construye el modelo en sí mismo. Esto le permite insertar la relación principal ya que no existen en el formulario. Es por eso que anular form.save()
no funciona.
En el caso de inlines genéricos, el método form.save()
nunca es llamado, y form.cleaned_data
se utiliza en lugar de obtener todos los valores, y Field.save_form_data()
se utiliza para almacenar los valores de la instancia de modelo.
FYI, algunos consejos generales para resolver este tipo de cosas; es realmente valioso tener un IDE (o tal vez una configuración vim o una configuración Sublime) que permita saltar a las definiciones de los símbolos de manera muy fácil. El código anterior fue resuelto saltando al código en línea/formset y ver qué está sucediendo. En el caso de PyCharm, eso funciona manteniendo presionado Command (o Ctrl) y haciendo clic en el símbolo. Si es usuario de vim, ctags
podría hacer algo similar para usted.
+1 ¡Para señalar que es mejor anular el método 'save()' en el Modelo! – Caumons