Escenario de uso bastante básico aquí. Quiero guardar el usuario que creó un objeto y el usuario que lo modificó por última vez. Sin embargo, es un modelo en línea así que, por supuesto, necesito usar save_formset
. La documentación de Django tienen el siguiente código de ejemplo:Permitir anulación adicional de save_formset en un ModelAdmin
class ArticleAdmin(admin.ModelAdmin):
def save_formset(self, request, form, formset, change):
instances = formset.save(commit=False)
for instance in instances:
instance.user = request.user
instance.save()
formset.save_m2m()
La cosa es, si se nota, ya que nunca se super
se llama, esto es un callejón sin salida. Si se subclasifica el ModelAdmin
y este método se reemplaza de la misma manera, se pierde la funcionalidad inherente al padre. Esto es importante porque se trata de un escenario de uso tan común que quiero factorizar la funcionalidad, por lo que crea el siguiente:
class TrackableInlineAdminMixin(admin.ModelAdmin):
def save_formset(self, request, form, formset, change):
instances = formset.save(commit=False)
for instance in instances:
if hasattr(instance, 'created_by') and hasattr(instance, 'modified_by'):
if not instance.pk:
instance.created_by = request.user
instance.modified_by = request.user
instance.save()
formset.save_m2m()
super(TrackableInlineAdminMixin, self).save_formset(request, form, formset, change)
me insertan en la llamada a super
por costumbre más que cualquier otra cosa, sin pensar que en realidad hará que el formset ahorre dos veces. Sin embargo, todavía funciona en todos los escenarios excepto en uno: eliminar. Tan pronto como intentes eliminar una línea en el administrador, obtienes un error. El error es bastante vago y no es realmente relevante para mi pregunta aquí, pero creo que está relacionado con intentar guardar el formset de nuevo después de haber eliminado una de las instancias en él. El código funciona bien cuando se elimina la llamada a super
.
De largo y corto, ¿hay alguna forma de que me falte personalizar el comportamiento de guardado del conjunto de formularios y para permitir que las subclases hagan su propia anulación?
Sólo encontrado [un boleto sin resolver] (https://code.djangoproject.com/ ticket/17988) para este – okm