【问题标题】:Overriding a Django admin.ModelAdmin function for all models覆盖所有模型的 Django admin.ModelAdmin 函数
【发布时间】:2009-07-31 00:03:00
【问题描述】:

我正在将 contrib.databrowse(用于查看)和 contrib.admin(用于编辑)拼接在一起,并且我想覆盖 admin.ModelAdmin 中的 response_change 函数,这样当单击保存,它会重定向回 databrowse 中的对象而不是管理员。我知道如何为 admin.py 中的特定模型执行此操作,例如:

class WhateverAdmin(admin.ModelAdmin):
    def response_change(self, request, obj):
        # stuff

admin.site.register(Whatever, WhateverAdmin)

但我想将它应用于我的所有模型,而不仅仅是一遍又一遍地复制函数(即在 admin.ModelAdmin 本身中覆盖它)。我应该在哪里以及如何做到这一点?

谢谢。 :)

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    您可以让您的管理类继承自 WhatAdmin 类。

    例如,您的应用布局为...

    \site_defaults
        __init__.py
        admin.py
    \your_app_1
        __init__.py
         models.py
         admin.py
    \your_app_2
        __init__.py
         models.py
         admin.py
    

    对于您拥有的 2 个应用程序,在 admin.py 中的代码类似于...

    from site_defaults.admin import WhateverAdmin
    
    class YourApp1Admin(WhateverAdmin):  # << note it's not admin.ModelAdmin
        # code over here
    

    【讨论】:

      【解决方案2】:

      感谢T. Stone's Idea,这是我的解决方案。

      如果我不更改任何其他内容,我不认为将每个模型注册到同一个 Admin 类。需要特殊更改的继承新类,其余调用 admin.site.register :

      class MyModelAdmin(admin.ModelAdmin):
          def response_change(self, request, obj):
              # code 
      
      class SomethingAdmin(MyModelAdmin): 
          # code specific to the Something model 
      
      admin.site.register(Something, SomethingAdmin)
      admin.site.register(Another, MyModelAdmin) 
      admin.site.register(OneMore, MyModelAdmin) 
      

      【讨论】:

        猜你喜欢
        • 2020-03-21
        • 2022-07-06
        • 1970-01-01
        • 2018-03-07
        • 2018-10-07
        • 1970-01-01
        • 2014-10-21
        • 2012-09-24
        • 1970-01-01
        相关资源
        最近更新 更多