day23_雷神_crm-day2
俺滴第一个项目 CRM
MdelForm 实现增删改查
1. ModelForm,重写 __init__ 方法,给所有字段添加 form-control 样式。
2. ModelForm,报错错误信息,在settings中 zh-hans
3. ModelForm,对象可以在模板中被循环。 change.html
4. ModelForm,自定义字段 + 钩子函数
权限部分
5. 表结构设计: 基于用户和基于角色的权限控制,请问为什么要引入角色表?
6. 权限系统中有几张表?5张
7. 权限实现流程图
- 白名单
- 正则、中间件
- 权限初始化
- ORM
- left join空值
- 去重
- 放入session
- 权限校验
- 正则、中间件
- 动态生成菜单
- inclusion_tag
- 粒度控制按钮
- filter
github
链接
https://github.com/houbinglei/crm_project2.git
项目步骤
templates目录,先找项目下的目录,然后再按照注册app顺序依次寻找
static也是同样
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
]
这个是在添加basedir下的static目录才用写。userlist的页面:先展示的list页面,objects.all()就可以了。
添加需要modelform生成,先写modelform类,forms文件夹,写user.py,里面写类。
循环form对象,相当于form.数据库的字段了。 input标签直接用{{ field }}就生成额。
ModelForm,重写 init 方法,self.fields.items(),k是字段名字,v是对象,可以v.widget.attrs['class'] = 'form-control',批量添加属性。
继承父类:super().init(varieties, sex, color,),super里或者不写,写的话是写自己,从自己往上找
ModelForm,报错错误信息,修改LANGUAGE_CODE = 'zh-hans'
增删改查。逐一实现。删除添加是否确定按钮
ModelForm,自定义字段 + 钩子函数,钩子函数需要返回值,是该字段的值,要不然在clean_data里该字段值为空
新建一个rbac的app,开始搞权限。
写login函数。
rbac,中间件白名单---视图函数login验证---通过做权限初始化---返回跳转页---还是中间件,通过session做权限判断---是否有权限访问
html模板中读不到配置文件,request.session.x1 这个x1改成配置文件,它读不到
模板中可以定义函数,
- 在已注册的app中创建一个templatetags的目录
- 在目录中任意创建一个文件rbac.py
- from django.template import Library
- register = Library()
代码
import re
from django.template import Library
from django.conf import settings
register = Library()
{% load rbac %} # 加载进来rbac.py里的所有函数
# 用于在为模板自定义函数,调用方式: {% func 1 2 3 4 %}
@register.simple_tag
def func(a1,a2,a3,a4):
return a1 + "666"
# 用于在为模板自定义函数,调用方式: {{ '田建宇'|foo:"dsb" }} + 可以在 if后面做条件
@register.filter
def foo(a1,a2):
return '999'
# 用于返回一个代码块
@register.inclusion_tag('rbac/menu.html')
def get_menu(request): # request通过页面调用的地方传递进来 {% get_menu request %}
menu_list = request.session.get(settings.RBAC_SESSION_MENU_KEY)
"""
[
{
'title':'x1',
'url':'/xxx/',
'name':x1,
},
{
'title':'x1',
'url':'/xxx/',
'name':x1,
'class':'active'
}
]
"""
for item in menu_list:
url = '^%s$' % item['url']
if re.match(url,request.path_info):
item['class'] = 'active'
return {
'menu_list': menu_list
}
@register.filter
def has_permission(request,name):
"""
判断用户是否有该name权限
:param request:
:param name:
:return:
"""
permission_dict = request.session.get(settings.RBAC_SESSION_PERMISSION_KEY)
if name in permission_dict:
return True
控制到颗粒按钮
{% extends 'layout.html' %}
{% load rbac %}
{% block content %}
{% if request|has_permission:'depart_add'%}
<div style="margin: 5px;">
<a href="/crm/depart/add/" class="btn btn-primary"><i class="fa fa-plus-circle" aria-hidden="true"></i> 添加</a>
</div>
{% endif %}
<table class="table table-bordered">
<thead>
<tr>
<th>ID</th>
<th>名称</th>
{% if request|has_permission:'depart_edit' or request|has_permission:'depart_del'%}
<th>操作</th>
{% endif %}
</tr>
</thead>
<tbody>
{% for row in depart_queryset %}
<tr>
<td>{{ row.id }}</td>
<td>{{ row.title }}</td>
{% if request|has_permission:'depart_edit' or request|has_permission:'depart_del'%}
<td>
{% if request|has_permission:'depart_edit' %}
<a href="/crm/depart/edit/{{ row.id }}/"><i class="fa fa-pencil-square-o" aria-hidden="true"></i></a>
{% endif %}
{% if request|has_permission:'depart_del' %}
<a href="/crm/depart/del/{{ row.id }}/" style="color: red;"><i class="fa fa-trash-o" aria-hidden="true"></i></a>
{% endif %}
</td>
{% endif %}
</tr>
{% endfor %}
</tbody>
</table>
<nav aria-label="Page navigation">
<ul class="pagination">
{{ pager.page_html|safe }}
</ul>
</nav>
{% endblock %}
day23_雷神_crm-day2的更多相关文章
- day23_雷神_git
git 版本控制工具 下载: https://git-scm.com/ git clone: 是用来拉代码的,git pull是更新当前分支的代码,拿到最新的代码,git pull是获取已经存在的仓库 ...
- 【从零开始学BPM,Day2】默认表单开发
[课程主题]主题:5天,一起从零开始学习BPM[课程形式]1.为期5天的短任务学习2.每天观看一个视频,视频学习时间自由安排. [第二天课程] Step 1 软件下载:H3 BPM10.0全开放免费下 ...
- NOIp2016 Day1&Day2 解题报告
Day1 T1 toy 本题考查你会不会编程. //toy //by Cydiater //2016.11.19 #include <iostream> #include <cstd ...
- day2
三级菜单: ))))))))))] last_levels.pop() ]]]]]]]]:] information = : ch = msvcrt.getch() ][][: : password= ...
- java day2一个模拟双色球的代码
package day2; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt ...
- Python基础-day2
1.Python模块python 中导入模块使用import语法格式:import module_name示例1: 导入os模块system('dir')列出当前目录下的所有文件 # _*_ codi ...
- 【BZOJ 4517】【SDOI 2016 Round1 Day2 T2】排列计数
本蒟蒻第一次没看题解A的题竟然是省选$Round1$ $Day2$ $T2$ 这道组合数学题. 考试时一开始以为是莫队,后来想到自己不会组合数的一些公式,便弃疗了去做第三题,,, 做完第三题后再回来看 ...
- 冲刺阶段 day2
day2 项目进展 今天本组五位同学聚在一起将项目启动,首先我们对项目进行了规划,分工,明确指出每个人负责哪些项目.由负责第一部分的组员开始编程,在已经搭建好的窗体内,对系部设置进行了编写,本校共六个 ...
- python_way ,day2 字符串,列表,字典,时间模块
python_way ,day2 字符串,列表,字典,自学时间模块 1.input: 2.0 3.0 区别 2.0中 如果要要用户交互输入字符串: name=raw_input() 如果 name=i ...
随机推荐
- 微信小程序开发——使用mock数据模拟api请求
前言: 微信小程序开发中,后端提供了接口设计文档,前端可以先mock数据模拟api请求进行开发调试,而且可以根据需要设计mock文件的格式和内容,这样在后端接口开发完成之前,前端可以最大限度的完成前端 ...
- trunk端口配置错误导致环路
端口下 switchport mode trunk spannning-tree portfast 上述两个命令同时执行将导致环路
- 【centos】/usr/bin与/usr/local/bin的区别
首先注意usr 指 Unix System Resource,而不是User 然后通常: /usr/bin下面的都是系统预装的可执行程序,会随着系统升级而改变. /usr/local/bin目录是给用 ...
- java中比较特殊的三个浮点数Infinity、-Infinity、NaN
学过javaScript的应该都知道,在js中的数值型number类型中有几个特殊的数,一个正无穷大.一个负无穷大.一个不是一个数NaN. 后来无意中发现java中也有这三个数,不过这三个数是浮点数, ...
- Java多线程消费者、生产者的基本思路
多线程主要考察的就是 线程的同步控制 生产者消费者的思路就是,当 一个线程执行时让另一个线程 挂起就行了 ThreadOne.ThreadTwo同时运行,添加一个变量在一个公共类(下边的Funct ...
- Android 8.0+ 更新安装apk失败的问题
最近做项目发现Android 8.0+ 更新安装apk时 出现安装失败的情况 总结原因是 缺少安装的权限 Android 8.0 (Android O)为了针对一些流氓软件引导用户安装其他无关应用. ...
- Java API使用
汉化版Java API使用 首次打开出现的问题 在首次打开API时,可能你会遇见这样的问题. 经过查阅,发现是因为文档的权限问题,文档未解锁造成的.这时候只需要给给它权限就可以. 首先关闭程序,单击右 ...
- PHP整理--MySQL--DOS命令操作数据库
一.MySQL:关系型数据库,存在表的概念. MySQL的结构:数据库可以存放很多表,每张表可以存放多个字段,每个字段可以存放多个记录. 二.Dos操作数据库 用PHPStudy终端➡其他选项菜单➡M ...
- google搜索引擎正确打开姿势
Google搜索引擎 原文来自黑白之道微信公众号 https://mp.weixin.qq.com/s/Ey_ODP_mG00of5DPwcQtfg 这里之所以要介绍google搜索引 ...
- android studio 模拟器不能使用的解决方案
1.安装模拟器的时候 AS提示是 VT -x is disable 进入电脑的 bios 系统设置,怎么进入--> 在开机的时候点击F2(华硕电脑,不同电脑方式不同) --在“configura ...