1. 角色、菜单、权限的增删该查
1. ModelForm增删改查
2. 增加和编辑使用同一个视图函数
Form()
1. 生成获取用户输入的标签
2. 对用户输入的内容做校验
3. 保留输入的内容同时展示错误提示信息
ModelForm()
1. 不需要自己写类中字段
2. 编辑的时候可以使用instance参数直接把要修改的实例传到form表单
1. 生成获取用户输入的标签时能够把instance的属性直接当成默认值
2. POST提交的时候可以直接调用save()保存数据
FormSet()
from django.forms import formset_factory
ModelFormSet()
from django.forms import modelformset_factory ORM复习(对象关系映射)
1. 对应关系
ORM 数据库
类 <--> 数据表
属性 <--> 字段
对象 <--> 数据行
2. 爬取icon图标
1. requests
2. beautifulsoup4 3. 权限批量录入
1. 集合的操作
1. 差集、交集、反交集
2. 获取一个Django项目的所有路由
rbac/utils/reload_routes.py
3. 页面上将没有入库的路由数据直接加载到addformset中
4. formset使用的三个要点
1. {{ formsetobj.management_form }} --> 管理form(提交数据的时候告诉后端我提交了多少条数据)
2. 每一条数据中都要有form_obj.id(添加的时候不需要,编辑的时候需要)
3. form表单的那三要素
2. 今日内容
 权限的批量操作
项目复杂之后URL有很多
1. 自动根据项目的URL录入路由信息(能自动获取路由别名和URL)
1. Django中的路由
二级路由 --> rbac:menu_list #:号就是分割命名空间的,也就是rbacapp的urls.py中还可以再include包另外的路由
三级路由 --> rbac:menu:menu_list
2. 自动录入写完之后会有三种情况:
1. 权限表里有,项目里面没有
2. 权限表里有,项目里面也有
3. 权限表里没有,项目里面有--如加新功能app 3. formset提交数据三要素
1. form表单
2. submit按钮
3. formset_obj.management_form
4. 因为使用的是Formset而不是ModelFormset所以不能调用save()保存,需要自己手动创建数据
1. 批量录入权限2 1. formset和modelformset的使用 2. 集合的操作 3. 如何巧妙的区分同一个action两次不同的POST请求 2. jQuery中文文档:http://jquery.cuishifeng.cn/ 3. 批量更新权限 1. 页面实现 1. Bootstrap、jQuery 2. 页面更新 1. 两个form表单POST提交数据 永远都唔好低估自己! 不负此生,前程似锦!

一.批量录入权限

 我想实现的是利用formset实现的是只要你访问某个url,就能把当前项目里所有的路由:第一部分项目里没有但权限表里没有的放在下图1新增中。第二部分是我权限表和项目里都有的,放在下图2更新权限中。第三部分是我数据库里有但项目里没有的,放在如下图3中,此三图在一个页面实现操作管理。

(1)rbac/utils/reload_routes.py:自动录入脚本

from django.conf import settings
from django.utils.module_loading import import_string #module_loading是加载模块
from django.urls import RegexURLResolver
from collections import OrderedDict #per_namespae是前一个命名空间,pre_url是上一级路由,urlpatterns路由表达式,生成一字典
def recursion_urls(pre_namespace, pre_url, urlpatterns, url_ordered_dict):
for item in urlpatterns:
# 如果是嵌套的URL
if isinstance(item, RegexURLResolver):
if pre_namespace:
if item.namespace:
#如果是嵌套的路由那就拿上一级路由命名空间给它拼起来,如果没有上一级则不用拼接直接赋值
namespace = '{}:{}'.format(pre_namespace, item.namespace,)
else:
namespace = pre_namespace
else:
if item.namespace:
namespace = item.namespace
else:
namespace = None
# 如果还有嵌套的三级、四级...路由就递归的执行
recursion_urls(namespace, pre_url + item.regex.pattern, item.url_patterns, url_ordered_dict)
# 普通URL
else:
if pre_namespace:
name = '{}:{}'.format(pre_namespace, item.name,)
else:
name = item.name
if not item.name:
raise Exception('URL路由中必须设置name属性')
url = pre_url + item.regex.pattern
# 把分析出来的每一条路由都以 命名空间:路由别名 为key 存到有序字典里
url_ordered_dict[name] = {'name': name, 'url': url.replace('^', '').replace('$', '')} def get_all_url_dict(ignore_namespace_list=None):#忽略命名空间的列表作为参数但它是可变类型所以设为none好
"""获取路由中"""
ignore_list = ignore_namespace_list or []
# 生成一个有序的字典
url_ordered_dict = OrderedDict()
# 导入Django的路由配置:import_string是根据一字符串导入的模块
root_url_conf = import_string(settings.ROOT_URLCONF)
# 生成一个空列表
urlpatterns = []
# for循环项目所有的路由--luffy_permission/urls.py中的所有路由列表--一级路由
for item in root_url_conf.urlpatterns:
#如果路由是regexurlresolver嵌套路由类型且命名空间在忽略的列表中就continue跳过这次循环
if isinstance(item, RegexURLResolver) and item.namespace in ignore_list:
continue
urlpatterns.append(item)
# 调用上方的函数分析并收集项目中的路由,None是pre_namespace参数(前一个命名空间--在django的路由里它可以嵌套好几层)
recursion_urls(None, '/', urlpatterns, url_ordered_dict)
return url_ordered_dict

(2)rbac/urls.py中:

#权限批量录入
url(r'^permission_entry/$', views.permission_entry, name='permission_entry'),

(3)rbac/views.py中:

from rbac.utils import permission ,reload_routes
from rbac.forms import RoleForm, MenuForm, PermissionForm
from django.forms import modelform_factory, formset_factory # 权限录入
def permission_entry(request):
# 项目里面所有的路由--当你一访问permission_entry时调用get_all_dict方法
all_urls = reload_routes.get_all_url_dict(ignore_namespace_list=['admin', ])
# 数据库中权限表中存储的所有路由
all_permissions = Permission.objects.all() # 用集合去判断
# 项目中所有路由的集合
project_url_set = set(all_urls.keys())
# 数据库中permission表中的路由集合
db_url_set = set([i.name for i in all_permissions])
# 项目中有,数据库中没有
only_in_project = project_url_set - db_url_set
# 这些路由应该是等待添加到数据库中权限表里面的数据
AddFormset = formset_factory(PermissionForm, extra=0)
add_formset_obj = AddFormset(initial=[v for k, v in all_urls.items() if k in only_in_project])
if request.method == 'POST':
add_formset_obj = AddFormset(request.POST)
if add_formset_obj.is_valid():
# 手动创建permission
objs = (Permission(**item) for item in add_formset_obj.cleaned_data)
Permission.objects.bulk_create(objs)
return redirect(reverse('rbac:permission_entry'))
return render(
request,
'rbac/permission_entry.html',
{'add_formset_obj': add_formset_obj}
)

(4)rbac/templates/rbac/permission_entry.html中:

  放三个小面板.

{% extends 'layout.html' %}

{% block content %}
<div class="container-fluid">
<div class="row">
<div class="col-md-12">
<form action="" method="post">
{% csrf_token %}
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">添加权限
<button class="btn btn-success btn-xs pull-right" type="submit">添加</button>
</h3>
</div>
<div class="panel-body">
<p>那些只在项目中,还没来得及太能加到permission表中的路由数据</p>
<table class="table table-bordered">
<thead>
<tr>
<th>#</th>
<th>title</th>
<th>url</th>
<th>show</th>
<th>name</th>
<th>menu</th>
</tr>
</thead>
<tbody>
{% for form_obj in add_formset_obj %}
{{ add_formset_obj.management_form }}
<tr>
{{ form_obj.id }}
<td>{{ forloop.counter }}</td>
<td>{{ form_obj.title }} <span>{{ form_obj.title.errors.0 }}</span></td>
<td>{{ form_obj.url }}</td>
<td>{{ form_obj.show }}</td>
<td>{{ form_obj.name }}</td>
<td>{{ form_obj.menu }}</td>
</tr>
{% endfor %} </tbody>
</table>
</div>
</div>
</form>
</div>
</div>
</div>
{% endblock %}

3

第五天.权限批量录入/更新、信号、Django日志配置的更多相关文章

  1. MYSQL-JDBC批量新增-更新-删除

    目录 1 概述 2 开启MYSQL服务端日志 3 深入MYSQL/JDBC批量插入 3.1 从一个例子出发 3.2 JDBC的批量插入操作 3.3 两个常被忽略的问题 3.5 误区 4 MYSQL/J ...

  2. 批量自动更新SVN版本库 - Windows

    开发过程中每天都要从SVN代码库里一个一个的update各个项目代码,不仅效率实在是低,也不符合程序员的"懒"精神,由于是在Windows环境做开发,自然就想到了使用bat来实现自 ...

  3. 批量录入快递地址-快宝地址服务(PHP代码示例)

    快递地址写错了怎么办?快递地址写的不详细怎么办?怎么皮批量录入收件人地址?微商怎么批量录入发件人地址?快宝地址清洗,有效的解决了寄送快递时,批量录入收件人信息.发件人信息时,纠正地址数据,不完整地址识 ...

  4. SqlServer-RBAC五表权限

    这只是一个精简的SqlServer-RBAC五表权限,根据自身需求修改即可 --创建数据库-权限CREATE DATABASE RBACGOUSE RBACGO --1.权限表CREATE TABLE ...

  5. ON DUPLICATE KEY UPDATE单个增加更新及批量增加更新的sql

    转: ON DUPLICATE KEY UPDATE单个增加更新及批量增加更新的sql 本文为博主原创,转载请注明出处. 在实际应用中,经常碰到导入数据的功能,当导入的数据不存在时则进行添加,有修改时 ...

  6. Gitlab用户在组中有五种权限:Guest、Reporter、Developer、Master、Owner

    Gitlab权限管理Gitlab用户在组中有五种权限:Guest.Reporter.Developer.Master.Owner Guest:可以创建issue.发表评论,不能读写版本库Reporte ...

  7. oracle批量新增更新数据

    本博客介绍一下Oracle批量新增数据和更新数据的sql写法,业务场景是这样的,往一张关联表里批量新增更新数据,然后,下面介绍一下批量新增和更新的写法: 批量新增数据 对于批量新增数据,介绍两种方法 ...

  8. Gitlab用户在组中有五种权限

    Gitlab用户在组中有五种权限:Guest.Reporter.Developer.Master.Owner Guest:可以创建issue.发表评论,不能读写版本库 Reporter:可以克隆代码, ...

  9. 第四百零五节,centos7下搭建sentry错误日志服务器,接收python以及Django错误,

    第四百零五节,centos7下搭建sentry错误日志服务器,接收python以及Django错误, 注意:版本,不然会报错 Docker >=1.11Compose >1.6.0 通过d ...

随机推荐

  1. Java实现 蓝桥杯算法提高 求最大值

    算法提高 求最大值 时间限制:1.0s 内存限制:256.0MB 问题描述 给n个有序整数对ai bi,你需要选择一些整数对 使得所有你选定的数的ai+bi的和最大.并且要求你选定的数对的ai之和非负 ...

  2. Java实现 LeetCode 657 机器人能否返回原点(暴力大法)

    657. 机器人能否返回原点 在二维平面上,有一个机器人从原点 (0, 0) 开始.给出它的移动顺序,判断这个机器人在完成移动后是否在 (0, 0) 处结束. 移动顺序由字符串表示.字符 move[i ...

  3. Java实现 LeetCode 629 K个逆序对数组(动态规划+数学)

    629. K个逆序对数组 给出两个整数 n 和 k,找出所有包含从 1 到 n 的数字,且恰好拥有 k 个逆序对的不同的数组的个数. 逆序对的定义如下:对于数组的第i个和第 j个元素,如果满i < ...

  4. Java实现蓝桥杯VIP算法训练 预测身高

    试题 算法训练 预测身高 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述: 生理卫生老师在课堂上娓娓道来: 你能看见你未来的样子吗?显然不能.但你能预测自己成年后的身高,有公式: 男 ...

  5. Java实现 蓝桥杯VIP 算法提高 项链

    算法提高 项链 时间限制:1.0s 内存限制:512.0MB 问题描述 由 n(1≤n≤100) 个珠子组成的一个项链,珠子有红.蓝.白三种颜色,各种颜色的珠子的安排顺序由键盘输入的字符串任意给定.蓝 ...

  6. Java实现 LeetCode 106 从中序与后序遍历序列构造二叉树

    106. 从中序与后序遍历序列构造二叉树 根据一棵树的中序遍历与后序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序 ...

  7. Java实现LeetCode 110. Balanced Binary Tree

    /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * Tre ...

  8. 问题解决:psql: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

    错误提示: psql: could not connect to server: No such file or directory Is the server running locally and ...

  9. Centos 各个版本的下载源

    China Alibaba Cloud Computing http://mirrors.aliyun.com/centos/ China Beijing Institute of Technolog ...

  10. 使用iText生成pdf文件

    前言 折腾了一早上的iText,下面主要介绍一下如何使用iText通过java代码生成pdf文档,以及如何输出包含中文的pdf文档. 首先,要说明的是,我用的是iText-7(java),下载链接是: ...