在 Django 中隐藏内联表单
我的 Django ModelAdmin 根据用户权限显示不同的表单。我已经用 ModelForm 的 (get_form, get_fieldsets) 解决了这个问题,但是如何处理内联呢?
class NewsAdmin(admin.ModelAdmin):
form = NewsAdminForm
writing_form = NewsWritingForm
inlines = (LinkInline, FileInline)
ModelAdmin 在获取请求对象之前在 ModelAdmin.__init__()
中初始化它们。唯一的方法似乎是使用 CSS 来隐藏它们。
My Django ModelAdmin shows different forms in dependency on user permissions. I've solved it with ModelForm's (get_form, get_fieldsets), but what to do with inlines?
class NewsAdmin(admin.ModelAdmin):
form = NewsAdminForm
writing_form = NewsWritingForm
inlines = (LinkInline, FileInline)
ModelAdmin initializes them in ModelAdmin.__init__()
before getting request object. The only way seems to use CSS to hide them.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您可以使用 ModelAdmin get_inline_instances 函数。
以下代码从 add_view 中删除内联:
You can use ModelAdmin get_inline_instances function.
Following code removes inlines from add_view:
ModelAdmin.__init__()
获取ModelAdmin.inlines
中的类,实例化它们,并将结果存储在ModelAdmin.inline_instances
中。您可以在__init__
之后将ModelAdmin.inline_instances
设置为空列表以删除内联。请参阅 django/contrib 的第 243 行/admin/options.py
ModelAdmin.__init__()
takes the classes inModelAdmin.inlines
, instantiates them, and stores the results inModelAdmin.inline_instances
. You can setModelAdmin.inline_instances
to an empty list after__init__
to remove the inlines.See line 243 of django/contrib/admin/options.py
我通过在
get_readonly_fields(self, request, obj=None)
方法中设置设置self.inline_instances = []
的逻辑解决了这个问题。例如,如果您想向超级用户而不是其他任何人显示内联:
I solved this by putting the logic to set
self.inline_instances = []
in theget_readonly_fields(self, request, obj=None)
method.For example, if you wanted to show the inlines to superusers but not to anyone else:
我在添加新对象时使用 bskinner 的技巧来隐藏内联,并进行了两项调整:首先,我必须覆盖“inlines”,而不是“inline_instances”,第二,确保始终返回 self.readonly_fields,以确保保留当它们被设置时。
I used bskinner's trick to hide inlines when adding a new object, with two adjustments: First, I had to overwrite "inlines", not "inline_instances", and second, make sure you always return self.readonly_fields, to make sure you are preserving those when they are set.