Ziemlich grundlegende Nutzung Szenario hier. Ich möchte den Benutzer, der ein Objekt erstellt hat, und den Benutzer, der es zuletzt geändert hat, speichern. Allerdings ist es ein Inline-Modell, so dass ich natürlich save_formset
verwenden muss. Die Django docs hat folgenden Beispielcode:Erlaube weiteres Überschreiben von save_formset auf einem 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()
Die Sache ist, wenn Sie feststellen, da super
nie aufgerufen wird, ist dies eine Sackgasse. Wenn die ModelAdmin
Unterklasse ist und diese Methode auf die gleiche Weise überschrieben wird, verlieren Sie die Funktionalität des übergeordneten Elements. Dies ist wichtig, denn dies ist eine solche gemeinsame Nutzung Szenario, das ich die Funktionalität ausklammern wollen, so habe ich die folgenden:
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)
ich auf den Anruf zu super
aus Gewohnheit mehr als alles andere geheftet, nicht zu denken, dass Tatsächlich wird das Formset zweimal gespeichert. Trotzdem funktioniert es in jedem Szenario außer einem: Löschen. Sobald Sie versuchen, eine Inline im Admin zu löschen, erhalten Sie eine Fehlermeldung. Der Fehler ist ziemlich vage und bezieht sich nicht unbedingt auf meine Frage hier, aber ich glaube, dass es damit zusammenhängt, das Formset erneut zu speichern, nachdem Sie gerade eine der Instanzen gelöscht haben. Der Code funktioniert einwandfrei, wenn der Anruf zu super
entfernt wird.
Lange und kurze, gibt es eine Möglichkeit, die ich vermisse sowohl das Formset speichern Verhalten und erlauben Unterklassen, ihre eigenen überschreiben tun?
Gerade gefunden [a ungelöst Ticket] (https://code.djangoproject.com/ Ticket/17988) hierfür – okm