Django Admin的权限管理

2023-04-11 00:00:00 django 管理 权限

Django Admin的权限管理提供了对系统中不同用户角色的访问权限的控制。

首先,需要在models.py文件中定义需要管理的Model类,并在admin.py文件中注册这些Model:

from django.contrib import admin
from .models import Blog

class BlogAdmin(admin.ModelAdmin):
    list_display = ('title', 'pub_date', 'author', 'is_published')

admin.site.register(Blog, BlogAdmin)

这里我们定义了一个Blog类,并为该类定义了一个BlogAdmin类,在BlogAdmin类中指定了需要显示在列表中的字段。

然后,在admin.py文件中定义用户角色和权限:

from django.contrib.auth.models import Group, Permission

# 定义用户角色
customer_group = Group.objects.create(name='Customer')
publisher_group = Group.objects.create(name='Publisher')

# 定义权限
customer_permissions = [
    Permission.objects.get(codename='view_blog'),
    Permission.objects.get(codename='add_comment'),
    Permission.objects.get(codename='change_comment')
]
publisher_permissions = [
    Permission.objects.get(codename='add_blog'),
    Permission.objects.get(codename='change_blog')
]

# 为角色赋予权限
customer_group.permissions.set(customer_permissions)
publisher_group.permissions.set(publisher_permissions)

在这里,我们定义了两个角色:Customer和Publisher,并给它们分别分配了不同的权限。其中,我们使用了Permission和Group模型,这些模型是Django Admin自带的。我们使用了codename属性来获取每个权限的唯一标识符。

最后,在admin.py文件中,我们可以为每个Model类指定角色和权限:

from django.contrib.auth.decorators import permission_required
from django.utils.decorators import method_decorator

class BlogAdmin(admin.ModelAdmin):
    list_display = ('title', 'pub_date', 'author', 'is_published')

    @method_decorator(permission_required('blog.add_blog', raise_exception=True))
    def add_view(self, request, form_url='', extra_context=None):
        return super().add_view(request, form_url, extra_context)

    @method_decorator(permission_required('blog.change_blog', raise_exception=True))
    def change_view(self, request, object_id, form_url='', extra_context=None):
        return super().change_view(request, object_id, form_url, extra_context)

    @method_decorator(permission_required('blog.delete_blog', raise_exception=True))
    def delete_view(self, request, object_id, extra_context=None):
        return super().delete_view(request, object_id, extra_context)

在这个例子中,我们使用了permission_required装饰器来限制用户角色和权限。这个装饰器会检查当前用户是否具有相应的权限,如果没有则会引发一个403 Forbidden错误。

更详细的Django Admin的权限管理请参考官方文档:https://docs.djangoproject.com/en/3.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.has_change_permission

相关文章