Переопределение (save_model) в админке django для всех моделей/приложений в проектах

Как я могу реализовать переопределение метода сохранения для всех моделей во всех приложениях в панели администратора?

def save_model(self, request, obj, form, change):
    
    pass

Я могу реализовать это в одной или двух моделях "наследовать и добавить в метод register", но мне действительно нужно, чтобы это выполнялось каждый раз, когда администратор нажимает сохранить в панели администратора и реализовать некоторый код перед сохранением.

В моей команде мы уже переопределили класс ModelAdmin. Ответ зависит от вашего проекта.

В примерах я использую старый синтаксис python super(), это помогает отлаживать код.

Простой способ с помощью класса. Создайте где-нибудь в проекте

from django.contrib.admin import ModelAdmin:

Class ModelAmin(ModelAdmin):
    def save_model(self, *args, **kwargs):
        # do some staff before
        super(ModelAdmin, self).save_model(*args, **kwargs)
        # do some staff after

Везде в проекте найдено from django.contrib.admin import ModelAdmin заменить на from module.with.myModelAdmin import ModelAdmin.

Всех следующих ModelAdmin'ов вы должны строить со своими ModelAdmin.

Второй способ с ModelAdminMixin. Код работает одинаково быстро. Где-нибудь поставьте миксин:

Class ModelAminMixin:
    def save_model(self, *args, **kwargs):
        # do some staff before
        super(ModelAdminMixin, self).save_model(*args, **kwargs)
        # do some staff after

Везде в проекте сделаны поиск с использованием regexp class BlaBlaBla(bla, bla, ModelAdmin): и замена на class BlaBlaBla(bla, bla, ModelAdminMixin, ModelAdmin):.

Все следующие ModelAdmins вы должны строить с наследованием от ModelAdminMixin и ModelAdmin. Это немного более гибко: вы можете решить добавить или нет этот миксин.

Следующий способ - MonkeyPatching.

Где-нибудь поставьте свой миксин из "второго способа". Где-то в admin.py:

from django.contrib.admin import ModelAdmin.
from module.with.myModelAdminMixin import ModelAdminMixin

ModelAdmin.__bases__ = (ModelAdminMixin,) + ModelAdmin.__bases__

После этого вы не должны делать что-то еще. Но это неправильный способ кодирования. Действительно ли "обезьяний патч" так плох?

Вернуться на верх