0

我有一个通用的 ModelAdmin,admin.py它替换了管理界面中的一些小部件。它作为我所有其他 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问题是,当我为in分配一个新值时LocationAdmin,我丢失了从SuitedUpAdmin. 我该如何处理?我目前使用的解决方案是在LocationAdmin.render_change_form方法中替换小部件实例,但我正在寻找更优雅和可读的选项。我想避免为此使用 ModelForms。期待您的建议!

4

2 回答 2

1

您可以将formfield_overrides基类SuitedUpAdmin与 dict 结合起来:

class LocationAdmin(SuitedUpAdmin):
    formfield_overrides = dict(SuitedUpAdmin.formfield_overrides, **{
        models.TextField: {'widget': AutosizedTextarea},
    })
于 2014-06-04T08:14:03.297 回答
1

您可以使用@property 来访问 super 的属性(我没有在 Django 管理员下尝试过,但纯 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
于 2014-06-04T08:15:41.393 回答