Разрешено дальнейшее переопределение набора форм сохранения _в ModelAdmin.

Довольно простой сценарий использования. Я хочу сохранить пользователя, создавшего объект, и пользователя, который последним изменил его. Однако это встроенная модель, поэтому мне, конечно, нужно использовать 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удален.

Короче говоря, есть ли какой-нибудь способ, который я упустил, чтобы настроить поведение сохранения набора форм и позволить подклассам выполнять свои собственные переопределения?

7
задан Chris Pratt 27 April 2012 в 18:07
поделиться