我的Django ModelAdmin依赖于用户权限显示不同的表单。我用ModelForm(get_form,get_fieldsets)解决了这个问题,但是如何处理内联?
class NewsAdmin(admin.ModelAdmin):
form = NewsAdminForm
writing_form = NewsWritingForm
inlines = (LinkInline, FileInline)
ModelAdmin在获取请求对象之前在ModelAdmin.__init__()
中初始化它们。唯一的方法似乎是使用CSS来隐藏它们。
答案 0 :(得分:5)
您可以使用ModelAdmin get_inline_instances函数。 以下代码从add_view中删除了内联:
from django.contrib import admin
from models import FooModel
class FooInline(admin.StackedInline):
model = FooModel
class MyModelAdmin(admin.ModelAdmin):
inlines = [FooInline]
def get_inline_instances(self, request, obj=None):
return obj and super(MyModelAdmin, self).get_inline_instances(request, obj) or []
答案 1 :(得分:1)
ModelAdmin.__init__()
获取ModelAdmin.inlines
中的类,实例化它们,并将结果存储在ModelAdmin.inline_instances
中。您可以在ModelAdmin.inline_instances
之后将__init__
设置为空列表以删除内联。
答案 2 :(得分:1)
我通过在self.inline_instances = []
方法中设置get_readonly_fields(self, request, obj=None)
的逻辑来解决这个问题。
例如,如果您想向超级用户展示内联,而不是向其他任何人展示:
def get_readonly_fields(self, request, obj=None):
if request.user.is_superuser:
return ()
else:
self.inline_instances = []
return ()
答案 3 :(得分:0)
我使用bskinner的技巧在添加新对象时隐藏内联,并进行了两次调整:首先,我必须覆盖“inlines”,而不是“inline_instances”,其次,确保始终返回self.readonly_fields,以确保你正在保留这些东西。
def get_readonly_fields(self, request, obj=None):
if obj:
# edit mode... add fields here to make them read-only when editing
return self.readonly_fields
else:
self.inlines = []
return self.readonly_fields