我的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。期待您的建议!
答案 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