Django管理用于更改和添加视图的不同内联线

Django管理用于更改和添加视图的不同内联线,django,django-admin,django-forms,inlines,Django,Django Admin,Django Forms,Inlines,我需要添加和更改页面的单独视图。在添加页面中,我想从内联表单集中排除一些字段。我准备了两个tablerinline类,其中一个包含属性“exclude”。我试着使用它们如下: class BoxAdmin(admin.ModelAdmin): def change_view(self, request, obj_id): self.inlines=[ItemChangeInline,] return super(BoxAdmin, self).change

我需要添加和更改页面的单独视图。在添加页面中,我想从内联表单集中排除一些字段。我准备了两个tablerinline类,其中一个包含属性“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)

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

为什么在添加视图中有
。添加视图(self,request)
而在更改视图中有
。更改视图(self.request,…)
?我相信,您不需要在add_视图中使用self,因为您使用的是super。

以下是似乎有效的代码:

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)
但是,这看起来不雅观,因为这部分:

            for inline_class in self.inlines:
            inline_instance = inline_class(self.model, self.admin_site)
            self.inline_instances.append(inline_instance)

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

它与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)

希望它对任何人都有用

我曾经遇到过这样的情况,我需要显示一个基于管理员站点的内联内容,您在该站点上观看的是一个给定的故事

通过扩展alekwisnia的答案,我能够使用以下代码获得适用于Django 1.3的动态内联:

在hights/admin.py中

在story/admin.py中


需要注意的一点是,我不仅仅是在操作内联类(HighlightInline),而是在更改内联实例(HighlightInline(self.model,self.admin_site))。这是因为django已经在admin类的初始构造期间基于内联类列表构造了一个内联实例列表。

django 1.3的另一个解决方案

class BoxAdmin(admin.ModelAdmin):

    def change_view(self, request, object_id, form_url='', extra_context=None):
        self.inline_instances = [ItemChangeInline(self.model, self.admin_site)]
        return super(BoxAdmin, self).change_view(request, object_id, extra_context)

    def add_view(self, request, form_url='', extra_context=None):
        self.inline_instances = [ItemAddInline(self.model, self.admin_site)]
        return super(BoxAdmin, self).add_view(request, form_url, extra_context)

灵感来自你们的回答, 我可以在admin.site中添加更多自定义视图

很多时候,只想添加不同设置的页面,而不是真正的额外视图

# admin.py
class FooAdmin(admin.ModelAdmin):
    ....
    def edit_tag(self, obj):              # add a Link tag to change-list page
        return mark_safe('<a href="{}?edit=True">Edit</a>'.format(obj.get_absolute_url()))

    edit_tag.short_description = u'Extra Action'

    def change_view(self, request, object_id, form_url='', extra_context=None):
        if request.GET.get('edit', False):
            self.readonly_fields = (
                'total_amount',
            )
            self.inlines = []
        else:
            self.readonly_fields = (
                'name', 'client', 'constructor', 'total_amount'
            )
            self.inlines = [TransactionInline]
        return super(ProjectAdmin, self).change_view(request, object_id)

    def add_view(self, request, form_url='', extra_context=None):
        self.readonly_fields = (
            'total_amount',
        )
        self.inlines = []
        return super(ProjectAdmin, self).add_view(request)
#admin.py
类FooAdmin(admin.ModelAdmin):
....
def edit_标记(self,obj):#添加链接标记以更改列表页面
返回mark\u safe(“”.format(obj.get\u absolute\u url()))
编辑\u tag.short\u description=u'Extra Action'
def change_视图(自身、请求、对象id、表单url=''、额外上下文=None):
如果request.GET.GET('edit',False):
self.readonly_字段=(
“总金额”,
)
self.inlines=[]
其他:
self.readonly_字段=(
“名称”、“客户”、“建造商”、“总金额”
)
self.inlines=[TransactionLine]
返回超级(ProjectAdmin,self)。更改视图(请求,对象id)
def add_视图(self、request、form_url=''、extra_context=None):
self.readonly_字段=(
“总金额”,
)
self.inlines=[]
返回超级(ProjectAdmin,self)。添加视图(请求)
在此之后,我将有三个视图:

  • 添加视图-无需内联表单集,无需添加相关对象。

  • 更改视图1-使用内联表单集,仅用于添加内联数据(相关对象),对象的字段为只读。

  • 更改视图2-无内联表单集,仅用于更改对象。


  • 非常简单,我们可以做得更多,谢谢大家。

    我一字不差地使用了它,它很有效,我用
    returnsuper(BoxAdmin,self)替换了这两个返回。更改视图(请求,对象id,表单url,额外上下文)
    返回super(BoxAdmin,self)。添加视图(请求,表单url,额外上下文)
    class BoxAdmin(admin.ModelAdmin):
    
        def change_view(self, request, object_id, form_url='', extra_context=None):
            self.inline_instances = [ItemChangeInline(self.model, self.admin_site)]
            return super(BoxAdmin, self).change_view(request, object_id, extra_context)
    
        def add_view(self, request, form_url='', extra_context=None):
            self.inline_instances = [ItemAddInline(self.model, self.admin_site)]
            return super(BoxAdmin, self).add_view(request, form_url, extra_context)
    
    # admin.py
    class FooAdmin(admin.ModelAdmin):
        ....
        def edit_tag(self, obj):              # add a Link tag to change-list page
            return mark_safe('<a href="{}?edit=True">Edit</a>'.format(obj.get_absolute_url()))
    
        edit_tag.short_description = u'Extra Action'
    
        def change_view(self, request, object_id, form_url='', extra_context=None):
            if request.GET.get('edit', False):
                self.readonly_fields = (
                    'total_amount',
                )
                self.inlines = []
            else:
                self.readonly_fields = (
                    'name', 'client', 'constructor', 'total_amount'
                )
                self.inlines = [TransactionInline]
            return super(ProjectAdmin, self).change_view(request, object_id)
    
        def add_view(self, request, form_url='', extra_context=None):
            self.readonly_fields = (
                'total_amount',
            )
            self.inlines = []
            return super(ProjectAdmin, self).add_view(request)