我该如何在管理员用户编辑中隐藏字段?主要是我想在某些情况下隐藏权限和组选择,但排除变量不起作用:/
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
Django管理页面的设计并不支持非常细粒度的控制,因此没有自动化变量被设计用于此类控制。
如果您需要此类控制,则必须自己进行操作。您需要覆盖默认的管理模板。您可能希望使用权限系统来跟踪用户被允许做什么。
请记住您所做的定制工作的级别。在某些时候,超出管理应用程序预期目的和限制的范围将比简单地开发自己更细粒度的CRUD系统更加繁琐。
self.exclude
是一个类属性,所以可能会得到意想不到的结果。我认为正确的方法是通过重写新的get_fields
、get_fieldsets
等方法。我是对的吗? - argaenself.exclude
(或任何其他类属性,如fields
、readonly_fields
等)是不安全的,因为每个进程只创建了一个ModelAdmin
实例。动态更改显示哪些字段必须使用get_fields()
和类似的方法来完成。 - Myk Willis