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

2024-10-01 15:47:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我的admin.py中有一个通用的ModelAdmin,它替换了管理界面中的一些小部件。它是我所有其他模型管理员的超类。看起来是这样的:

#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的超类,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},
    }
    #(...)

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


Tags: djangoinfrompyimportadmin部件models
2条回答

可以将基类SuitedUpAdmin中的formfield_overrides与dict组合:

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

您可以使用@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

相关问题 更多 >

    热门问题