【问题标题】:Django admin.ModelAdmin inheritanceDjango admin.ModelAdmin 继承
【发布时间】:2013-10-15 12:30:23
【问题描述】:

是否可以从 Django admin.ModelAdmin 类创建子类

我正在尝试做类似的事情:

class PageAdmin(admin.ModelAdmin):
    form = PageAdminForm
    # Plus many other stuff here (that I don't want to copy/paste in PlacePageAdmin to keep dry...)

class PlacePageAdmin(PageAdmin):
    form = PlacePageAdminForm

    def get_form(self, request, obj=None, **kwargs):
        return super(PlacePageAdmin, self).get_form(request, obj, **kwargs)

    def get_fieldsets(self, request, obj=None):
        fieldsets = copy.deepcopy(super(PlacePageAdmin, self).get_fieldsets(request, obj))
        fieldsets.insert(0,
            ('Place', {
                'fields': (
                    ('address', 'postcode', 'town'),
                ),
            })
        )
        return fieldsets

    def queryset(self, request):
        return PlacePage.objects.filter(page_type=Page.PLACE)

但我无法让它工作:尝试访问 PlacePageAdmin 表单页面时出现u"Key 'address' not found in Form" 错误。

有人做过这样的事吗?

非常感谢您!

编辑 - 表单代码:

class PageAdminForm(forms.ModelForm):
    extra_field = forms.CharField()
    class Meta:
        model = Page

class PlacePageAdminForm(PageAdminForm):
    class Meta:
        model = PlacePage

【问题讨论】:

  • 是的,你可以。你已经在做。但我认为你的错误是在 PlacePageAdminForm 表单中,而不是在你的模型管理子类中
  • 添加您的表单类代码。
  • 感谢您的回答:我编辑了我的消息以添加表单类代码。
  • 不知道这是怎么回事?
  • 这2种表格怎么指向不同的型号?在我看来,它们应该代表相同的模型

标签: python django django-forms django-inheritance


【解决方案1】:

当然可以,这是基本的 python,你可以创建更多可以添加到类继承列表中的 mixin,这可能更有用 - 作为从多个源继承的更小更简单的示例

您遇到的错误与您的表单有关,很少有可能出错的地方

  • 最流行的是定义 form.ModelForm 中的哪些字段 - 这些字段在 ModelForm 类中的 Meta 类中指定 - 继承存在问题,因此请确保在继承的表单中正确设置它

  • 可能存在未在第二个表单或模型中定义的字段 - 那么您的表单继承可能会失败

【讨论】:

    猜你喜欢
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多