如何避免在子类中重写ModelAdmin选项?

时间:2014-06-04 07:53:43

标签: python django inheritance django-modeladmin

我的admin.py中有一个通用的ModelAdmin,它取代了管理界面中的一些小部件。它作为我所有其他ModelAdmins的超类。它看起来像这样:

#in mainapp/admin.py:
from django.contrib import admin
from django.db import models
from suit.widgets import SuitSplitDateTimeWidget

class SuitedUpAdmin(admin.ModelAdmin):
    formfield_overrides = {
        models.DateTimeField: {
            'widget': SuitSplitDateTimeWidget
        },
        #(...)
    }
    #(...)

在另一个Django应用程序中,我使用SuitedUpAdmin作为ModelAdmin的超类,它也试图替换一些小部件:

#in events/admin.py:
from django.contrib import admin
from django.db import models
from suit.widgets import AutosizedTextarea
from mainapp.admin import SuitedUpAdmin

class LocationAdmin(SuitedUpAdmin):
    formfield_overrides = {
        models.TextField: {'widget': AutosizedTextarea},
    }
    #(...)

问题是,当我在formfield_overrides中为LocationAdmin分配新值时,我会丢失从SuitedUpAdmin继承的先前值。我怎么处理这个?我目前使用的解决方案是用LocationAdmin.render_change_form方法替换小部件实例,但我正在寻找更优雅和可读的选项。我想避免使用ModelForms。期待您的建议!

2 个答案:

答案 0 :(得分:1)

您可以将基类formfield_overrides中的SuitedUpAdmin与dict结合使用:

class LocationAdmin(SuitedUpAdmin):
    formfield_overrides = dict(SuitedUpAdmin.formfield_overrides, **{
        models.TextField: {'widget': AutosizedTextarea},
    })

答案 1 :(得分:1)

您可以使用@property来访问super的属性(我没有在Django admin下尝试过这个,但纯Python示例工作正常):

class SuperAttributes(object):
    formfield_overrides = {
        'field.Something': 'overrides'
    }


class ChildAttributes(SuperAttributes):
    @property
    def formfield_overrides(self):
        attrs = super(ChildAttributes, self).formfield_overrides
        attrs['field.SomethingElse'] = 'overrides'
        return attrs


child = ChildAttributes()
print child.formfield_overrides

编辑:更多Pythonic继承了类

class ChildAttributes(SuperAttributes):
    @property
    def formfield_overrides(self):
        attrs = super(ChildAttributes, self).formfield_overrides
        attrs.update({
            'field.SomethingElse': 'overrides'
        })
        return attrs