需求分析:
- 1、不同用户可能有不同的权限;
- 2、权限体现即为登录后显示的菜单列表;
例如:教师有 查看负责的班级、批改作业、报名录入、报名审核等功能,所以登录后显示如下图:
学生只有 查看和提交作业 的功能,登录后显示为下图:
Models.py
一个用户可以有多个角色,一个角色可以有多个菜单(权限)。
from django.db import models
from django.contrib.auth.models import AbstractUser, User
class Menu(models.Model):
"""动态菜单"""
name = models.CharField(max_length=64)
url_type_choices = (
(0, 'absolute'),
(1, 'dynamic'), # 带参数的url
)
url_type = models.SmallIntegerField(choices=url_type_choices)
url_name = models.CharField(max_length=128)
def __str__(self):
return self.name
class Meta:
unique_together = ('name', 'url_name')
db_table = '菜单'
verbose_name = '菜单'
verbose_name_plural = verbose_name
class Role(models.Model):
"""角色,可以包括学生,讲师等"""
title = models.CharField(max_length=64, unique=True)
menu = models.ManyToManyField('Menu')
def __str__(self):
return self.title
class Meta:
verbose_name = '角色'
verbose_name_plural = verbose_name
db_table = '角色'
class UserProfile(AbstractUser):
"""用户信息"""
# 一个角色可以对应多个用户,一个用户可以有多个角色
role = models.ManyToManyField('Role', blank=True, null=True)
def __str__(self):
return self.username
class Meta:
verbose_name = '用户信息'
verbose_name_plural = verbose_name
db_table = '用户信息'
index.html
<ul class="nav nav-sidebar">
<!--1、循环当前登录用户的所有角色-->
{% for role in request.user.role.select_related %}
<!--2、循环每个角色的所有菜单(权限)-->
{% for menu in role.menu.select_related %}
<!--3、判断当前页面是否是与当前菜单一致,存储为is_active变量,供随后使用-->
<li class="{% is_active menu.url_name request.path as is_active %}">
<!--4、直接根据is_active变量判断是够增加高亮属性-->
<a class="{% if is_active %}menu_active{% else %}{% endif %}"
href="{% if menu.url_type == 0 %}{{ menu.url_name }}{% else %}{% url menu.url_name %}{% endif %}">
{{ menu.name }}
</a>
</li>
{% endfor %}
{% endfor %}
</ul>
后台操作
1、添加menu
2、添加角色,并指定menu
3、给用户分配角色即可