Довольно простой сценарий использования. Я хочу сохранить пользователя, создавшего объект, и пользователя, который последним изменил его. Однако это встроенная модель, поэтому мне, конечно, нужно использовать save_formset
. В документации Django есть следующий пример кода:
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()
Дело в том, если вы заметили, что поскольку super
никогда не вызывается, это тупик -. Если ModelAdmin
является подклассом и этот метод переопределяется таким же образом, вы теряете функциональность, присущую родителю. Это важно, потому что это настолько распространенный сценарий использования, что я хочу выделить функциональность, поэтому я создал следующее:
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)
Я добавил вызов super
по привычке больше, чем что-либо еще, не думая, что это действительно будет привести к тому, что набор форм будет сохранен дважды. Тем не менее, он по-прежнему работает во всех сценариях, кроме одного :удаления. При попытке удалить инлайн в админке выдает ошибку. Ошибка довольно расплывчатая и на самом деле не имеет отношения к моему вопросу здесь, но я полагаю, что это связано с попыткой снова сохранить набор форм после того, как вы только что удалили один из экземпляров в нем. Код отлично работает, когда вызов super
удален.
Короче говоря, есть ли какой-нибудь способ, который я упустил, чтобы настроить поведение сохранения набора форм и позволить подклассам выполнять свои собственные переопределения?