[英]Override (save_model) in django admin for All models/apps in projects
如何在管理面板內的所有應用程序中為所有模型實現覆蓋保存方法?
def save_model(self, request, obj, form, change):
pass
我可以在一兩個模型中實現它“繼承並在注冊方法中添加它”,但我真的需要它在管理員單擊管理面板中的保存並在保存之前執行一些代碼時執行。
在我的團隊中,我們已經覆蓋ModelAdmin
class。 答案取決於您的項目。
在示例中,我使用舊的 python super() sintaxis,它有助於調試代碼。
class 的簡單方法。 在項目中的某處創建
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
replace 到from module.with.myModelAdmin import ModelAdmin
在項目中的任何地方都可以找到。
您應該使用您的 ModelAdmin 構建所有下一個ModelAdmin
。
第二種方式ModelAdminMixin
。 代碼也一樣快。 某處放了mixin:
Class ModelAminMixin:
def save_model(self, *args, **kwargs):
# do some staff before
super(ModelAdminMixin, self).save_model(*args, **kwargs)
# do some staff after
在項目中的任何地方都使用正則表達式class BlaBlaBla(bla, bla, ModelAdmin):
並替換為class BlaBlaBla(bla, bla, ModelAdminMixin, ModelAdmin):
。
您應該使用ModelAdminMixin
和ModelAdmin
。 這更靈活一點:您可以決定是否添加此 mixin。
下一個方法 - MonkeyPatching 。
Somethere把你的mixin從“第二種方式”。 admin.py 中的某處:
from django.contrib.admin import ModelAdmin.
from module.with.myModelAdminMixin import ModelAdminMixin
ModelAdmin.__bases__ = (ModelAdminMixin,) + ModelAdmin.__bases__
之后你不應該做其他事情。 但這是一種錯誤的編碼方式。 “猴子補丁”真的那么糟糕嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.