Django实战-信息资讯-CMS权限管理

Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。

权限是能够约束用户行为和控制页面显示内容的一种机制。一个完整的权限应该包含3个要素: 用户,对象和权限,即什么用户对什么对象有什么样的权限。

对于本次项目中的应用,可以分为编辑组、财务组、管理员。Django 的权限permission 本质是 djang.contrib.auth 中的一个模型, 其与 User 的 user_permissions 字段是多对多的关系。在 INSTALLED_APP 里添加好 auth 应用之后,在执行完makemigrations 和 migrate 命令后,Django 就会为每一个安装的app中的模型(Model)自动创建4个可选的权限:add,delete,change和view(增/删/改/查)。可以通过admin将这些权限分配给不同用户。

  • auth_group

用户组

  • auth_group_permissions

用户组权限

  • auth_permission

用户权限

① ContentType 将模型和app进行关联

from django.contrib.auth.models import ContentType

ContentType 是Django内置的一个应用,可以追踪项目中所有app和model的对应关系,并记录在ContentType表中。

models.py文件的表结构写好后,通过 makemigrations 和 migrate 两条命令迁移数据后,在数据库中会自动生成一个 django_content_type 表。每当创建了新的 model并执行数据库迁移后,ContentType 表中就会自动新增一条记录。

② Group 用户组

from django.contrib.auth.models import Group

用户组(Group)和 User 模型是多对多的关系。其作用在权限控制时可以批量对用户的权限进行管理和分配,而不用一个一个用户分配,节省工作量。将一个用户加入到一个Group中后,该用户就拥有了该Group所分配的所有权限。

django.contrib.auth.models.Group 定义了用户组的模型, 每个用户组拥有 id 和 name 两个字段, 该模型在数据库被映射为 auth_group 数据表。

User 对象中有一个名为 groups 的多对多字段, 多对多关系由 auth_user_groups数据表维护。Group 对象可以通过 user_set 反向查询用户组中的用户。可以通过创建删除 Group 对象来添加或删除用户组。

③ Permission 权限

from django.contrib.auth.models import Permission

权限都是django.contrib.auth.Permission的实例。这个模型包含三个字段,name、codename以及content_type,其中的 content_type 表示这个permission是属于哪个app下的哪个models。

④ 自定义 Command 命令

from django.core.management.base import BaseCommand

Django 对于命令的添加有一套规范,可以为每个app 指定命令,比如在使用manage.py文件执行命令的时候,可以自定制命令,来实现命令的扩充。

1、在 app 内创建一个management 的python目录

2、在 management 目录里面创建 commands 的 python 文件夹

3、在 commands 文件夹下创建任意py文件

此时py文件名就是自定义命令名,可以使用下面方式执行:

python manage.py 命令名

Django的Command命令是要放在一个app的management/commands目录下的。

初始化分组

from apps.news.models import News, NewsCategory, Banner, Conment
from apps.course.models import Course, CourseCategory, CourseOrder
from apps.payinfo.models import PayinfoOrder, Payinfo
from django.core.management.base import BaseCommand
from django.contrib.auth.models import Group, Permission, ContentType
class Command(BaseCommand):
    def handle(self, *args, **options):
        # 编辑组
        # python manage.py initgroup
        # 编辑人员的权限,编辑文章/轮播图/付费咨询/课程
        edit_content_types = [
            ContentType.objects.get_for_model(News),
            ContentType.objects.get_for_model(NewsCategory),
            ContentType.objects.get_for_model(Banner),
            ContentType.objects.get_for_model(Conment),
            ContentType.objects.get_for_model(Course),
            ContentType.objects.get_for_model(CourseCategory),
            ContentType.objects.get_for_model(Payinfo),
        ]
        edit_permissions = Permission.objects.filter(content_type__in=edit_content_types)
        editGroup = Group.objects.create(name='编辑')
        editGroup.permissions.set(edit_permissions)

        # 创建财务组
        finance_content_types = [
            ContentType.objects.get_for_model(CourseOrder),
            ContentType.objects.get_for_model(PayinfoOrder)
        ]
        finance_permissions = Permission.objects.filter(content_type__in=finance_content_types)
        financeGroup = Group.objects.create(name='财务')
        financeGroup.permissions.set(finance_permissions)

        # 创建管理员分组
        admin_permissions = edit_permissions.union(finance_permissions)
        adminGroup = Group.objects.create(name='管理员')
        adminGroup.permissions.set(admin_permissions)

        self.stdout.write(self.style.SUCCESS('初始化分组已经添加成功'))

原文发布于微信公众号 - 数据云团(SmartData)

原文发表时间:2019-07-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券