rbac集成 权限分配。之用户管理

时间:2021-08-23 21:49:53

流程都是一样的。就不在详细的记录。只写一点需要注意的地方! 或者 可以改进的地方!

1. 用户表中 只有。 name  password email 三个字段。 但是添加用户的页面,应该还要有确认密码的字段。
  所以,在UserInfoModelForm(forms.ModelForm):  中需要自己添加一个字段:
       confirm_password = forms.CharField(label="确认密码")
2. 样式问题,因为是基于bootstrap 所以会简单很多。  添加class属性的方法, 有两种:
  a. 手动添加:

    class Meta:
model = models.UserInfo
fields = ["name", "password", "confirm_password", "email"]
手动的修改,显示什么样的错误信息 # 这里我是修改settings中的,语言配置。 改成 zh-hans
error_messages = {
"name": {"required": "用户名不能为空"},
"password": {"required": "密码不能为空"},
"confirm_password": {"required": "确认密码不能为空"},
"email": {"required": "邮箱不能为空"},
}
     widgets = {"title": forms.TextInput(attrs={"class": "form-control"})}

通过widgets 属性, 对每一个字段,添加属性。 比较麻烦。
  b. 使用初始化方法, 继承父类。进行修改。

    def __init__(self, *args, **kwargs):
super(UserInfoModelForm, self).__init__(*args, **kwargs)
# 循环父类中生成的所有的字段,为每一个字段添加样式, 一次性为所有字典添加样式
for name, field in self.fields.items():
field.widget.attrs["class"] = "form-control"

3. 然后是,局部钩子。 错误信息的展示:

    def clean_confirm_password(self):
'''
检测两次密码 是否一致
:return:
'''
password = self.cleaned_data.get("password")
confrim_password = self.cleaned_data.get("confirm_password")
if password != confrim_password:
raise ValidationError("两次密码输入不一致")
return confrim_password

4. 编辑页面 与 重置密码。
      对于用户的编辑,普通信息和 密码, 应该要分开进行。处理。  所以新添加两个 forms 组件。
全部的forms组件:

from django import forms
from django.core.exceptions import ValidationError, NON_FIELD_ERRORS
from rbac import models
import re class UserInfoModelForm(forms.ModelForm):
'''
用户 添加, form组件
'''
confirm_password = forms.CharField(label="确认密码")
class Meta:
model = models.UserInfo
fields = ["name", "password", "confirm_password", "email"]
widgets = {
"name":{}
}
def __init__(self, *args, **kwargs):
super(UserInfoModelForm, self).__init__(*args, **kwargs)
for name, field in self.fields.items():
field.widget.attrs["class"] = "form-control" def clean_confirm_password(self):
'''
检测两次密码 是否一致
:return:
'''
password = self.cleaned_data.get("password")
confrim_password = self.cleaned_data.get("confirm_password")
if password != confrim_password:
raise ValidationError("两次密码输入不一致")
return confrim_password class UpdateUserInfoModelForm(forms.ModelForm):
'''
修改用户时, 使用这个form组件
'''
class Meta:
model = models.UserInfo
fields = ["name", "email"] def __init__(self, *args, **kwargs):
super(UpdateUserInfoModelForm, self).__init__(*args, **kwargs)
for name, field in self.fields.items():
field.widget.attrs["class"] = "form-control" class ResetPasswordUserInfoModelForm(forms.ModelForm):
'''重置密码的工作'''
confirm_password = forms.CharField(label="确认密码") class Meta:
model = models.UserInfo
fields = ["password", "confirm_password"] def __init__(self, *args, **kwargs):
super(ResetPasswordUserInfoModelForm, self).__init__(*args, **kwargs)
for name, field in self.fields.items():
field.widget.attrs["class"] = "form-control" def clean_confirm_password(self):
'''
检测两次密码 是否一致
:return:
'''
password = self.cleaned_data.get("password")
confrim_password = self.cleaned_data.get("confirm_password")
if password != confrim_password:
raise ValidationError("两次密码输入不一致")
return confrim_password

针对用户的 form 组件

视图函数部分:

'''角色管理'''
from django.shortcuts import HttpResponse, render, redirect
from django.http import JsonResponse
from django.urls import reverse
from rbac import models
from rbac.forms.user import UserInfoModelForm,UpdateUserInfoModelForm,ResetPasswordUserInfoModelForm def user_list(request):
'''
角色列表的功能
:param request:
:return:
'''
user_queryset = models.UserInfo.objects.all()
return render(request, "rbac/user_list.html", locals()) def user_add(request):
'''
添加角色的功能
:param request:
:return:
'''
forms = UserInfoModelForm()
if request.method == "POST":
forms = UserInfoModelForm(request.POST)
if forms.is_valid(): # 验证成功
forms.save() # 进行保存
return redirect(reverse("rbac:user_list"))
else:
return render(request, "rbac/change.html", {"forms": forms})
return render(request, "rbac/change.html", {"forms": forms}) def user_edit(request, pk):
'''
编辑角色
:param request:
:param pk: 要修改的角色id
:return:
'''
user_obj = models.UserInfo.objects.filter(pk=pk).first()
if not user_obj:
return HttpResponse("用户不存在") if request.method == "POST":
forms = UpdateUserInfoModelForm(instance=user_obj, data=request.POST)
if forms.is_valid():
forms.save()
return redirect(reverse("rbac:user_list"))
else:
return render(request, "rbac/change.html", {"forms": forms})
forms = UpdateUserInfoModelForm(instance=user_obj) # 将查询出来的对象交给form组件, 进行渲染。
return render(request, "rbac/change.html", {"forms": forms}) def user_del(request, pk):
'''
删除操作, 需要给与用户提示。
:param reuqest:
:param pk: 要删除的角色id
:return:
'''
origin_url = reverse("rbac:user_list")
role_queryset = models.UserInfo.objects.filter(pk=pk)
if not role_queryset:
return HttpResponse("角色不存在")
if request.method == "POST":
role_queryset.delete()
return redirect(origin_url)
return render(request, "rbac/role_del.html", {"cancel": origin_url}) def reset_pwd(request, pk):
'''
重置密码
:param request:
:param pk:
:return:
'''
user_obj = models.UserInfo.objects.filter(pk=pk).first()
if not user_obj:
return HttpResponse("用户不存在") if request.method == "POST":
forms = ResetPasswordUserInfoModelForm(instance=user_obj, data=request.POST)
if forms.is_valid():
forms.save()
return redirect(reverse("rbac:user_list"))
else:
return render(request, "rbac/change.html", {"forms": forms})
forms = ResetPasswordUserInfoModelForm()
return render(request, "rbac/change.html", {"forms": forms})

user 视图函数

模板部分,只有展示列表,是不相同的, 其他的 添加编辑, 删除。 都是使用同一套页面:

{% extends "layout.html" %}

{% block content %}
<div class="luffy-container">
<div class="btn-group" style="margin: 5px 0">
<a class="btn btn-default" href="{% url 'rbac:user_add' %}">
<i class="fa fa-plus-square" aria-hidden="true"></i> 添加用户
</a>
</div>
<table class="table table-bordered table-hover">
<thead>
<tr>
<th>序号</th>
<th>ID</th>
<th>用户名</th>
<th>邮箱</th>
<th>重置密码</th>
<th>选项</th>
</tr>
</thead>
<tbody>
{% for user in user_queryset %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ user.id }}</td>
<td>{{ user.name }}</td>
<td>{{ user.email }}</td>
<td><a href="{% url 'rbac:reset_pwd' pk=user.id %}">重置密码</a></td>
<td>
<a style="color: #333333;" href="{% url 'rbac:user_edit' pk=user.id %}">
<i class="fa fa-edit" aria-hidden="true"></i></a>
<a style="color: #d9534f;" href="{% url 'rbac:user_del' pk=user.id %}"><i
class="fa fa-trash-o"></i></a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endblock %}

模板部分

总结:
  - Model Form
    - 字段的自定制, 添加数据库字段没有的,额外字段。 并进行统一的验证。
    - 局部钩子的方法,用于对某一个字段, 进行二次校验。
    - 错误提示:
      - 手动修改,使用 error_messages = {.......} , 每个字段进行添加。
      - settings 中修改配置文件:  LANGUAGE_CODE = 'zh-hans'    使django中form组件的英文提示全部变成中文
    - 重写__init__方法, 统一给所有的字段添加属性   (class="form-control")

UserInfoModelForm

rbac集成 权限分配。之用户管理的更多相关文章

  1. rbac集成 权限分配。之角色管理

    权限分配功能拆分: a. 角色管理 b. 用户管理 c. 菜单和权限的管理 d. 批量的权限操作 e. 分配权限 先实现 角色管理: 无非也就是,增删改查: 定义路由, 编写视图. 1.查看角色页面: ...

  2. LigerUI权限系统之用户管理

    用户管理较之前的的组织结构和菜单管理稍显复杂.不管怎样还是先上图吧,再来讲解 左边是组织结构,右边是用户,用户是跟组织机构挂钩的,通过点击左边的组织结构,来刷新右边,加载该组织机构下的用户. 用户管理 ...

  3. Mysql权限操作、用户管理、密码操作

    Mysql的权限 mysql中存在4个控制权限的表,分别为user表,db表,tables_priv表,columns_priv表. mysql权限表的验证过程为: 先从user表中的Host,Use ...

  4. linux&lpar;raspbian&rpar;下mysql的安装&comma;权限设置和用户管理

    一 MySQL安装:(1) 使用apt-get安装, 由于raspbian是基于Debian的*操作系统,debian默认自带apt-get指令安装应用因此可以使用来安装 sudo apt-get ...

  5. Linux - 用户管理与文件权限

    目录 Linux - 用户管理与文件权限 创建普通用户 切换用户 userdel删除用户 sudo 命令 文件与目录权限 Linux权限的解读 目录权限 查看用户权限的命令 文件权限 修改权限的命令 ...

  6. MySQL用户管理&plus;MySQL权限管理

    我们现在默认使用的都是root用户,超级管理员,拥有全部的权限! 但是,一个公司里面的数据库服务器上面可能同时运行着很多个项目的数据库! 所以,我们应该可以根据不同的项目建立不同的用户,分配不同的权限 ...

  7. RBAC角色权限设计思路

    1 设计思路 为了设计一套具有较强可扩展性的用户认证管理,需要建立用户.角色和权限等数据库表,并且建立之间的关系,具体实现如下. 1.1 用户 用户仅仅是纯粹的用户,用来记录用户相关信息,如用户名.密 ...

  8. linux基本防护措施,权限分配和提高防护安全

    设置用户失效 1.失效的用户将无法登录 使用chage命令将用户zhangsan的账户设为当前已失效(比如已经过去的某个时间): [root@proxy ~]# useradd zhangsan [r ...

  9. Mysql用户管理及权限分配

    早上到公司,在服务器上Mysql的数据库里新建了个database,然后本地的系统里用原来连接Mysql账号admin连这个数据库.结果报错了,大概是这样子的: Access denied for u ...

随机推荐

  1. synchronized的实现原理和应用

    在多线程并发编程中synchronized是元老级的角色,人多称重量级锁. synchronized实现同步的基础:Java中的每一个对象都可以作为锁.具体表现有如下3种: 1.对于普通同步方法,锁时 ...

  2. &lbrack;后端人员耍前端系列&rsqb;AngularJs篇:使用AngularJs打造一个简易权限系统

    一.引言 上一篇博文已经向大家介绍了AngularJS核心的一些知识点,在这篇博文将介绍如何把AngularJs应用到实际项目中.本篇博文将使用AngularJS来打造一个简易的权限管理系统.下面不多 ...

  3. 【Spring】构建Springboot项目 实现restful风格接口

    项目代码如下: package hello; import org.springframework.boot.SpringApplication; import org.springframework ...

  4. paip&period;php 5&period;0 5&period;3 5&period;4 5&period;5 -6&period;0的新特性总结与比较

    paip.php 5.0 5.3 5.4  5.5 -6.0的新特性总结与比较 PHP5的新特性 2 · 对象的参照过渡是默认的(default) 3 · 引入访问属性的限制 3 · 引入访问方法的限 ...

  5. Iframe刷新父窗口的几种方式

    /*Iframe刷新父窗口的几种方式在iframe的子页面中,使用onload刷新父页面的时候,遇到了一些问题. 1.目前来说,测试成功,并且兼容IE6/7和FF的刷新方式. */ <scrip ...

  6. R语言学习笔记 之 可视化地研究参*相似性

    基于相似性聚类 很多时候,我们想了解一群人中的一个成员与其他成员之间有多么相似.例如,假设我们是一家品牌营销公司,刚刚完成了一份有潜力新品牌的研究调查问卷.在这份调查问卷中,我们向一群人展示了新品牌的 ...

  7. ipython与python的区别

    http://mba.shengwushibie.com/itbook/BookChapter.asp?id=8745 http://www.cnblogs.com/yangze/archive/20 ...

  8. poj1922

    Ride to School Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 18704   Accepted: 7552 D ...

  9. Delph组件如何使用自己的图标&lpar;转&rpar;

    源:http://blog.csdn.net/henreash/article/details/7298451

  10. Python Learning - Two

    1.  Built-in Modules and Functions 1) Function def greeting(name): print("Hello,", name) g ...