Django管理用于更改和添加视图的不同内联线
我需要添加和更改页面的单独视图。在添加页面中,我想从内联表单集中排除一些字段。我准备了两个tablerinline类,其中一个包含属性“exclude”。我试着使用它们如下: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
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)。添加视图(请求)
在此之后,我将有三个视图:
非常简单,我们可以做得更多,谢谢大家。我一字不差地使用了它,它很有效,我用
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)