Django admin - 如何在用户编辑中隐藏一些字段?
Posted
技术标签:
【中文标题】Django admin - 如何在用户编辑中隐藏一些字段?【英文标题】:Django admin - how to hide some fields in User edit? 【发布时间】:2011-09-28 09:26:43 【问题描述】:如何在管理员用户编辑中隐藏字段?主要是我想隐藏在某些例外中选择的权限和组,但排除变量不起作用:/
【问题讨论】:
【参考方案1】:我可能会迟到回答这个问题,但无论如何,都可以。 John 在概念上是正确的,但我只是想这样做,因为我知道 django admin
非常灵活。
在用户模型表单中隐藏字段的方式是:
1. ModelAdmin
类的exclude
属性可用于隐藏字段。
2: 模型中应该允许空白。
3: 模型字段上的default
属性是一个优势,否则您可能会遇到意外错误。
我遇到的问题是我曾经遇到过验证错误。我查看了回溯,发现
错误是因为UserAdmin
的fieldsets
分组,默认的permission
字段集有user_permission
在您的子分类模型管理员中覆盖它。
使用get_form
中的exclude
属性可以访问request
变量,并且可以根据用户的权限或组动态设置它。
代码:
admin.py:
class MyUserAdmin(UserAdmin):
list_display = ("username","first_name", "last_name", "email","is_active","is_staff","last_login","date_joined")
## Static overriding
fieldsets = (
(None, 'fields': ('username', 'password')),
(_('Personal info'), 'fields': ('first_name', 'last_name', 'email')),
(_('Permissions'), 'fields': ('is_active', 'is_staff', 'is_superuser',
'groups')),
(_('Important dates'), 'fields': ('last_login', 'date_joined')),
)
def get_form(self, request, obj=None, **kwargs):
self.exclude = ("user_permissions")
## Dynamically overriding
self.fieldsets[2][1]["fields"] = ('is_active', 'is_staff','is_superuser','groups')
form = super(MyUserAdmin,self).get_form(request, obj, **kwargs)
return form
【讨论】:
我知道这是一个老问题,但是这个线程安全吗?self.exclude
是一个类属性,因此您可能会获得不需要的结果。我认为要走的路是覆盖新的get_fields
、get_fieldsets
等方法。我说的对吗?
@argaen 你是对的;初始化后分配给self.exclude
(或任何其他类属性,如fields
、readonly_fields
等)是不安全的,因为每个进程只创建每个ModelAdmin
的单个实例。动态更改显示的字段必须使用get_fields()
和类似方法完成。【参考方案2】:
django admin 不是为非常精细的控制而设计的,因此它们不是为允许这种类型的控制而设计的自动变量。
如果您需要这种类型的控制,您将不得不自己动手。您需要覆盖默认的管理模板。您可能希望使用权限系统来跟踪允许用户执行的操作。
请记住您正在进行的自定义级别。在某些时候,远远超出管理应用程序的预期目的和限制将比简单地滚动您自己的更细粒度的 CRUD 系统更多工作。
【讨论】:
只要你真正阅读手册,你就可以实现非常高水平的细粒度控制。以上是关于Django admin - 如何在用户编辑中隐藏一些字段?的主要内容,如果未能解决你的问题,请参考以下文章
将用户友好的 json 编辑器添加到 django admin