Scenario di utilizzo piuttosto semplice qui. Voglio salvare l'utente che ha creato un oggetto e l'utente che lo ha modificato per l'ultima volta. Tuttavia, è un modello in linea, quindi, ovviamente, devo usare save_formset
. La documentazione Django hanno il seguente codice di esempio:Consentire l'override di save_formset su 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()
Il fatto è che, se si nota, in quanto super
non viene mai chiamato, questo è un vicolo cieco. Se lo ModelAdmin
è sottoclasse e questo metodo è sovrascritto nello stesso modo, si perde la funzionalità inerente al genitore. Questo è importante perché si tratta di un tale scenario di utilizzo comune che voglio fattore la funzionalità, così ho creato il seguente:
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)
ho appiccicato la chiamata a super
per abitudine più che altro, non pensando che in realtà farà sì che il formset salvi due volte. Tuttavia, funziona ancora in tutti gli scenari tranne uno: eliminazione. Non appena si tenta di eliminare un inline nell'amministratore, si ottiene un errore. L'errore è piuttosto vago e non mi piace molto alla mia domanda qui, ma credo che sia collegato al tentativo di salvare di nuovo il formset dopo che hai appena eliminato una delle istanze in esso. Il codice funziona perfettamente quando viene rimossa la chiamata a super
.
Lungo e breve, c'è un modo che mi manca per personalizzare il comportamento di salvataggio del formset e consentire alle sottoclassi di eseguire la propria sovrascrittura?
Appena trovato [un biglietto irrisolto] (https://code.djangoproject.com/ ticket/17988) per questo – okm