【发布时间】:2011-09-28 09:26:43
【问题描述】:
如何在管理员用户编辑中隐藏字段?主要是我想隐藏在某些例外中选择的权限和组,但排除变量不起作用:/
【问题讨论】:
标签: django django-admin django-users
如何在管理员用户编辑中隐藏字段?主要是我想隐藏在某些例外中选择的权限和组,但排除变量不起作用:/
【问题讨论】:
标签: django django-admin django-users
我可能会迟到回答这个问题,但无论如何,都可以。 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 等方法。我说的对吗?
self.exclude(或任何其他类属性,如fields、readonly_fields 等)是不安全的,因为每个进程只创建每个ModelAdmin 的单个实例。动态更改显示的字段必须使用get_fields() 和类似方法完成。
django admin 不是为非常精细的控制而设计的,因此它们不是为允许这种类型的控制而设计的自动变量。
如果您需要这种类型的控制,您将不得不自己动手。您需要覆盖默认的管理模板。您可能希望使用权限系统来跟踪允许用户执行的操作。
请记住您正在进行的自定义级别。在某些时候,远远超出管理应用程序的预期目的和限制将比简单地滚动您自己的更细粒度的 CRUD 系统更多工作。
【讨论】: