Dość podstawowy scenariusz użycia tutaj. Chcę zapisać użytkownika, który utworzył obiekt i użytkownika, który go zmodyfikował. Jest to jednak model inlined, więc oczywiście potrzebuję użyć save_formset
. Django docs mają następujący przykładowy kod:Umożliwienie dalszego zastępowania save_formset na 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()
Chodzi o to, jeśli zauważy, ponieważ super
nigdy nie jest wywoływana, to jest ślepa. Jeśli podklasowana jest ModelAdmin
i ta metoda jest nadpisywana w ten sam sposób, tracisz funkcjonalność właściwą rodzicowi. To ważne, ponieważ jest to taki wspólny scenariusz wykorzystanie że chcę czynnik poza funkcjonalność, więc stworzyłem następujące:
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)
ja zostałam zaatakowana na wezwanie do super
z przyzwyczajenia bardziej niż cokolwiek innego, nie myśląc, że to faktycznie spowoduje, że zestaw będzie dwa razy oszczędzał. Niemniej jednak nadal działa w każdym scenariuszu z wyjątkiem jednego: usuwanie. Natychmiast po próbie usunięcia wbudowanego w administratora pojawia się błąd. Błąd jest dość nieprecyzyjny i nie jest to odpowiedź na moje pytanie tutaj, ale uważam, że jest to związane z próbą zapisania formformy ponownie po tym, jak właśnie usunąłeś jedną z wystąpień. Kod działa poprawnie po usunięciu połączenia z super
.
Długi i krótki, czy jest jakiś sposób, że brakuje mi zarówno dostosować zachowanie oszczędzania zestawu formularzy i umożliwić podklasom zrobić własne przesłonięcie?
Wystarczy znaleźć [a nierozwiązane bilet] (https://code.djangoproject.com/ Bilet/17988) za to – okm