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将这些权限分配给不同用户。
用户组
用户组权限
用户权限
① 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
此时py文件名就是自定义命令名,可以使用下面方式执行:
python manage.py 命令名
初始化分组
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('初始化分组已经添加成功'))