簡體   English   中英

在 django 管理員中為項目中的所有模型/應用程序覆蓋 (save_model)

[英]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):

您應該使用ModelAdminMixinModelAdmin 這更靈活一點:您可以決定是否添加此 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM