Django管理不同的内联更改并添加视图

ale*_*nia 13 django django-forms django-admin inlines

我需要单独的视图来添加和更改页面.在添加页面中,我想从内联formset中排除一些字段.我准备了两个TabularInline类,其中一个包含属性'exclude'.我尝试使用它们如下:

class BoxAdmin(admin.ModelAdmin):
    def change_view(self, request, obj_id):
        self.inlines=[ItemChangeInline,]
        return super(BoxAdmin, self).change_view(self.request, obj_id)
    def add_view(self, request):
        self.inlines=[ItemAddInline,]
        return super(BoxAdmin, self).add_view(self, request)
Run Code Online (Sandbox Code Playgroud)

没有效果(根本没有显示内联).

And*_*tti 17

它适用于Django 1.5+,看起来很优雅:

// admin.py
class BoxAdmin(ModelAdmin):

    inlines = ()

    def change_view(self, request, object_id, form_url='', extra_context=None):
        self.inlines = (ItemChangeInline, )
        return super(BoxAdmin, self).change_view(request, object_id)

    def add_view(self, request, form_url='', extra_context=None):
        self.inlines = (ItemAddInline, )
        return super(BoxAdmin, self).add_view(request)
Run Code Online (Sandbox Code Playgroud)

希望它对任何人都有用

  • 我逐字使用它并且它有效,我用`return super(BoxAdmin, self).change_view(request, object_id, form_url, extra_context)`和`return super(BoxAdmin, self).add_view(request, form_url)替换了两个返回, extra_context)` (2认同)

ale*_*nia 7

这是似乎工作的代码:

class BoxAdmin(admin.ModelAdmin):
   def change_view(self, request, obj_id):
        self.inlines=[ItemChangeInline,]
        for inline_class in self.inlines:
            inline_instance = inline_class(self.model, self.admin_site)
            self.inline_instances.append(inline_instance)
        return super(BoxAdmin, self).change_view(request, obj_id)
    def add_view(self, request):
        self.inlines=[ItemAddInline,]
        for inline_class in self.inlines:
            inline_instance = inline_class(self.model, self.admin_site)
            self.inline_instances.append(inline_instance)
        return super(BoxAdmin, self).add_view(request)
Run Code Online (Sandbox Code Playgroud)

然而,这看起来不优雅,导致这部分:

            for inline_class in self.inlines:
            inline_instance = inline_class(self.model, self.admin_site)
            self.inline_instances.append(inline_instance)
Run Code Online (Sandbox Code Playgroud)

是来自admin.ModelAdmin的init方法的复制粘贴(因此它运行两次).


gru*_*czy 1

为什么在 add_view 中你有.add_view(self, request),而在 Change view 中你有.change_view(self.request, ..)?我相信,您在 add_view 中不需要 self ,因为您使用了 super 。