接上篇,配置django后台admin,进入管理后台。添加一些数据,首先添加用户,分别添加3个用户,添加3个岗位开发、测试和运维;再添加权限表,权限路径根据django中的url填写,显示名字分别为增、删、改、查/主机、用户、菜单等;添加权限组,组名为主机、用户、菜单;最后添加菜单,菜单填写页面左侧要显示的菜单名,如主机、用户等。添加数据后还要把这些数据关联起来,如用户设置岗位,岗位配置权限,权限配置权限组,权限组再和菜单关联。
用户表,关联职位表的职位
职位表,关联权限表的权限,可以多选
权限表,关联权限组表
权限组表,关联菜单表
表中添加了数据,再写个demo
urls.py设置路由,主页需要登录
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$', views.login),
]
views.py登录数据处理
def login(request):
if request.method == "GET":
return render(request, "login.html")
user = request.POST.get("username", False)
pwd = request.POST.get("password", False)
if not user or not pwd:
error = "用户名或密码不能为空!"
return render(request, "login.html", locals())
else:
user_obj = models.Users.objects.filter(username=user, password=pwd) #获取到QuerySetList
if user_obj.first():
request.session['login'] = user_obj.first().username
obj = user_obj.values('position__auth__name',
'position__auth__url',
'position__auth__group__name',
'position__auth__group__title__title') #获取到QuerySetList的values,分别为权限名字、权限路径、权限组名字、菜单名
for i in obj:
print(i.get('position__auth__name'),
i.get('position__auth__url'),
i.get('position__auth__group__name'),
i.get('position__auth__group__title__title'),
)
return redirect("/hosts/")
else:
error = "用户名或密码不正确,请重新输入!"
return render(request, "login.html", locals())
login.html代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form action="/" method="post">
{% csrf_token %}
用户名: <input type="text" name="username">
密 码: <input type="password" name="password">
{{ error }}
<input type="submit" value="登录">
</form>
</body>
</html>
权限主要是url路径,url路径作用一个是菜单页面跳转,另一个是验证用户是否有该url的访问权限。
在页面的左侧菜单中显示权限菜单,权限菜单中,菜单下有子菜单,可以是查看权限、查看权限组、查看岗位、查看菜单、查看用户;然后在每个子菜单中的查看页面再设置添加、编辑和删除相关的按钮来实现这些功能,这些查看、添加、编辑和删除都是通过url路径来达到权限的设置。这些url和要显示的菜单名通过views中获取的数据组成dict和list,方便数据处理。
另外,还有一个需求是当点击进入某个菜单时,菜单要有个特殊的样式,表明进入的页面是该菜单项。当对子菜单内显示的数据进行添加、编辑和删除操作时,该子菜单依然有特殊样式。
对models.py中auth权限表添加一个字段
class Auth(models.Model):
url = models.CharField(max_length=32, blank=True, null=True, verbose_name="路径")
name = models.CharField(max_length=32, blank=True, null=True, verbose_name="显示")
group = models.ForeignKey(to='AuthGroup', blank=True, null=True, verbose_name="权限组", related_name="authgroup")
to_display = models.ForeignKey(to='Auth', blank=True, null=True, verbose_name="显示", related_name="authtoauth")
def __str__(self):
return self.name
class Meta:
verbose_name_plural = "权限表"
auth表添加了一个to_display字段,自己来关联自己,代码的功能实现下篇介绍