Django管理界面 - 如何隐藏用户编辑中的某些字段?

3
我该如何在管理员用户编辑中隐藏字段?主要是我想在某些情况下隐藏权限和组选择,但排除变量不起作用:/
2个回答

10
我可能晚了回答这个问题,但无论如何,我还是要说一下。John的概念是正确的,但我想这样做是因为我知道django admin确实很灵活。
无论如何,在User模型表单中隐藏字段的方法是:
1.可以使用ModelAdmin类的exclude属性来隐藏字段。
2.应该在模型中允许空白。
3.模型字段上的默认属性是一个优势,否则你可能会得到意外的错误。
我的问题是,我曾经遇到过验证错误。我查看了跟踪记录,并发现错误是由于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

1
我知道这是一个旧问题,但是,这个线程是安全的吗?self.exclude是一个类属性,所以可能会得到意想不到的结果。我认为正确的方法是通过重写新的get_fieldsget_fieldsets等方法。我是对的吗? - argaen
1
@argaen 你是正确的;在初始化之后分配给self.exclude(或任何其他类属性,如fieldsreadonly_fields等)是不安全的,因为每个进程只创建了一个ModelAdmin实例。动态更改显示哪些字段必须使用get_fields()和类似的方法来完成。 - Myk Willis

-5

Django管理页面的设计并不支持非常细粒度的控制,因此没有自动化变量被设计用于此类控制。

如果您需要此类控制,则必须自己进行操作。您需要覆盖默认的管理模板。您可能希望使用权限系统来跟踪用户被允许做什么。

请记住您所做的定制工作的级别。在某些时候,超出管理应用程序预期目的和限制的范围将比简单地开发自己更细粒度的CRUD系统更加繁琐。


8
只要你认真阅读说明书,就能够实现非常高级的细粒度控制。 - Shayne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接