【问题标题】:Exclude a field in django admin for users not super admin为非超级管理员的用户排除 django admin 中的字段
【发布时间】:2011-03-28 17:54:07
【问题描述】:

如果用户不是超级管理员,我将如何在 django admin 中排除一个字段?

谢谢

【问题讨论】:

    标签: django django-admin django-forms


    【解决方案1】:

    我是这样做的:

    admin.py

    def add_view(self, request, form_url='', extra_context=None):  
            if not request.user.is_superuser:     
                self.exclude=('activa', )        
            return super(NoticiaAdmin, self).add_view(request, form_url='', extra_context=None)
    

    【讨论】:

    • 但我也需要用 change_view 重复 :(,有人有另一种方法吗?谢谢
    • 你不能对change_view做同样的事情吗?
    • 一切都好,我做到了,只是我想知道是否有其他方法:)
    • 更改 self.exclude 会影响所有以下请求。
    【解决方案2】:

    如果你有很多视图,你可以使用这个装饰器:

    def exclude(fields=(), permission=None):
        """
            Exclude fields in django admin with decorator
        """
        def _dec(func):
            def view(self, request, *args, **kwargs):
                if not request.user.has_perm(permission):
                    self.exclude=fields
                return func(self, request, *args, **kwargs)
            return view
        return _dec
    

    用法: @exclude(fields=('fonction', 'fonction_ar'))

    【讨论】:

      【解决方案3】:

      重写 exclude 属性有点危险,除非你记得为其他权限设置它,更好的方法可能是重写 get_form 方法。

      见:Django admin: exclude field on change form only

      【讨论】:

        【解决方案4】:

        在未来,看起来会有一个 get_fields 钩子。但它只是在 master 分支中,不是 1.5 或 1.6。

        def get_fields(self, request, obj=None):
            """
            Hook for specifying fields.
            """
            return self.fields
        

        https://github.com/django/django/blob/master/django/contrib/admin/options.py

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-04-28
          • 1970-01-01
          • 1970-01-01
          • 2012-02-10
          • 2015-05-04
          • 2013-12-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多