Переопределение (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__
После этого вы не должны делать что-то еще. Но это неправильный способ кодирования. Действительно ли "обезьяний патч" так плох?