Django中给model增加view权限的方法

django中的model默认有3中权限,add、change、del权限,但在使用中需要使用view权限,也就是只读(read only)权限,网上查了好多资料,现在将解决方法贴在这里,以备查询,参考链接 http://www.forrestliu.com/2011/03/25/Django-Admin-add-read-only-prem

Django的权限是在admin.ModelAdmin中设置的,因此我们需要继承该类,并实现只读效果

首先,在工程中添加 view_model_admin.py,内容如下:

from django.contrib import admin
from django.contrib.auth.models import Permission

class CustomModelAdmin(admin.ModelAdmin):

    def has_view_permission(self, request, obj=None):
        opts = self.opts
        view_permission = 'view_%s' %self.model._meta.module_name
        return request.user.has_perm(opts.app_label + '.' + view_permission)

    def has_change_permission(self, request, obj=None):
        if hasattr(self,'has_change'):
            if self.has_change:
                return True

        return super(CustomModelAdmin,self).has_change_permission(request, obj)

    def get_model_perms(self, request):
        value = super(CustomModelAdmin,self).get_model_perms(request)
        value['view'] = self.has_view_permission(request)
        return value

    def changelist_view(self, request, extra_context=None):
        if self.has_view_permission(request, None):
            self.has_change = True
        result = super(CustomModelAdmin,self).changelist_view(request, extra_context)
        self.has_change = False
        return result

同时,在admin.py中,继承的类由 admin.ModelAdmin改为CustomModelAdmin 就可以了~

后记:根据朋友的回复,我补充一下,在完成上面的步骤之后,权限的控制部分已经完成了,但这时候在后台中我们是没有办法看到只读权限的,这时候,需要我们进行一些手工操作。

打开数据库,有 auth_permission这样一个Table,观察会发现,默认情况下,Django已经为我们设计的每一个model都分配了 add , change ,del权限,如:

id                   name                          content_type_id                   codename
19             Can add 区域                               7                           add_area
20             Can change 区域                            7                           change_area
21             Can delete 区域                            7                           delete_area

我们只要手动添加上View权限就可以,可以添加这样一个字段

id自动增长,不管;name = Can view 区域  ; content_type_id = 7 ; codename = view_area

解释一下,其中name是在后台中权限中看到的部分,content_type_id是Django为model分配的Id,在django_content_type中也可以查到,codename是在Django代码中作为识别权限用的,绝对不能填写错误。

根据文章的代码可以发现,此处是用view作为只读权限的关键字的,所有codename中,添加的是 view_area,其他以此类推。

写入数据库,再次登入后台,就可以看到该权限,并且使用了。

有一个使用环境,比如在后台中,如果字段中没有数据,而拥有add权限的话,是可以点击+立即添加的,但如果我们只给他分配view权限,那么就不会出现这个加号。

About: happyhls


5 thoughts on “Django中给model增加view权限的方法”

    1. 你好,我的工程里面就是这样使用的。忘了补充一下:查看权限是无法在后台自动添加的,需要手动写入到数据库中,这样你在后台就可以看到该权限了。并且会发现,这种机制是可以起作用的。我已经补充到文章中。

  1. 应该可以不用在数据库里面添加,只需要在model里面添加就可以了.codename=描述
    比如:
    class Meta:
    verbose_name = u”在线反馈”
    verbose_name_plural = u’在线反馈’
    permissions = ((‘view_feedback’,’view_feedback’),)
    使用的时候,给admin加上:
    def get_readonly_fields(self, request, obj=None):
    if not request.user.is_superuser and request.user.has_perm(‘edition.view_feedback’):
    return [f.name for f in self.model._meta.fields]
    return self.readonly_fields管理界面授权的时候,同时加上change和view

  2. 参考的是:
    http://stackoverflow.com/questions/1336382/how-can-i-modify-django-to-create-view-permission?lq=1
    里面有个错误,
    request.user.has_perm(‘mymodel.readonly_mymodel’):
    mymodel应该是app的名称,不是model的名称
    比如edition的feedbackmodel的权限判定request.user.has_perm(‘edition.view_feedback’):

    https://docs.djangoproject.com/en/1.5/ref/contrib/auth/#django.contrib.auth.models.User.has_perm:
    As for the has_perm() method, permission names take the form “.” (i.e. polls.can_vote for a permission on a model in the polls application).

发表评论

电子邮件地址不会被公开。 必填项已用*标注