├── .DS_Store
├── images
├── image1.png
├── image10.png
├── image2.png
├── image4.png
├── image5.png
├── image6.png
├── image7.png
├── image8.png
└── image9.png
├── export_import.md
├── action.md
├── jssdk.md
├── setup.md
├── home.md
├── README.md
├── charts.md
├── table.md
└── permissions.md
/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/newpanjing/simplepro/HEAD/.DS_Store
--------------------------------------------------------------------------------
/images/image1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/newpanjing/simplepro/HEAD/images/image1.png
--------------------------------------------------------------------------------
/images/image10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/newpanjing/simplepro/HEAD/images/image10.png
--------------------------------------------------------------------------------
/images/image2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/newpanjing/simplepro/HEAD/images/image2.png
--------------------------------------------------------------------------------
/images/image4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/newpanjing/simplepro/HEAD/images/image4.png
--------------------------------------------------------------------------------
/images/image5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/newpanjing/simplepro/HEAD/images/image5.png
--------------------------------------------------------------------------------
/images/image6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/newpanjing/simplepro/HEAD/images/image6.png
--------------------------------------------------------------------------------
/images/image7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/newpanjing/simplepro/HEAD/images/image7.png
--------------------------------------------------------------------------------
/images/image8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/newpanjing/simplepro/HEAD/images/image8.png
--------------------------------------------------------------------------------
/images/image9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/newpanjing/simplepro/HEAD/images/image9.png
--------------------------------------------------------------------------------
/export_import.md:
--------------------------------------------------------------------------------
1 | # simplepro 导入导出
2 |
3 | simplepro导入导出是依赖 `django-import-export`插件,配置请参考该插件的文档。
4 |
5 | 在自定义按钮附近使用导出和右边工具栏使用导入导出:
6 |
7 |
8 | ```python
9 |
10 | from import_export import resources
11 | from import_export.admin import ImportExportModelAdmin, ImportExportActionModelAdmin
12 |
13 | class ProxyResource(resources.ModelResource):
14 | class Meta:
15 | model = Employe
16 |
17 | @admin.register(Employe)
18 | class EmployeAdmin(ImportExportActionModelAdmin):
19 | resource_class = ProxyResource
20 |
21 | ```
22 |
23 |
--------------------------------------------------------------------------------
/action.md:
--------------------------------------------------------------------------------
1 | # simplepro 自定义按钮
2 | 自定义按钮也叫action,是ModelAdmin中的actions一员。
3 | 定义例子:
4 | ```python
5 |
6 | actions=['custom_button']
7 | def custom_button(self, request, queryset):
8 | pass
9 |
10 | ```
11 |
12 | 该按钮文档与simpleui完全一致,请查看文档[自定义按钮](https://github.com/newpanjing/simpleui/blob/master/QUICK.md#%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8C%89%E9%92%AE)
13 |
14 | simplepro在自定义actions的基础上进行了扩展,入参和出参与django admin不同。
15 |
16 | + 入参
17 |
18 | 入参是只request.POST中收到的参数
19 |
20 | |字段|类型|说明|
21 | |-----|-----|-----|
22 | |action|string|该值是用于simplepro路由使用,可以不予理会|
23 | |all|string|取值0和1,0未全部选择,1全部选中|
24 | |key|string|自定义按钮的方法名|
25 | |ids|string|逗号分隔的选中的id,如果all=1,该值没有|
26 |
27 | + 出参
28 |
29 | 出参是指自定义按钮方法体返回的数据
30 |
31 | 例子:
32 | ```python
33 | def test(self, request, queryset):
34 | return {
35 | 'state': False,
36 | 'msg': '用户关联的数据还没有删除!'
37 | }
38 | ```
39 |
40 | + 字段说明:
41 |
42 | |字段|类型|说明|
43 | |-----|-----|-----|
44 | |state|boolean|true成功,false失败|
45 | |msg|string|前台通知框的信息|
46 |
--------------------------------------------------------------------------------
/jssdk.md:
--------------------------------------------------------------------------------
1 | # JS-SDK
2 |
3 | 为了提供更好的前端扩展,simplepro提供了jssdk,在不用重新页面的同时,进行页面最高程度的扩展。
4 |
5 | ## 使用例子:
6 |
7 |
8 | 首先通过Admin中的Media引入自定义的js文件
9 |
10 | 例子:
11 | ```python
12 |
13 | @admin.register(Department)
14 | class DepartmentAdmin(admin.ModelAdmin):
15 |
16 | class Media:
17 | js=('aa.js','bb.js')
18 | css=('dd.css','cc.css')
19 | ```
20 |
21 | 然后aa.js中 注册事件
22 |
23 | ```javascript
24 |
25 | //所有的方法或者属性都是可选
26 |
27 | SIMPLEAPI={
28 | //在vue完成初始化后调用
29 | init:function(app){
30 | //通过app对象,可以控制页面上所有的元素显示隐藏
31 |
32 | },
33 | toolbar:function(type,app){
34 | //type=按钮类型,添加=add,删除=delete,编辑=edit,其他自定义按钮的type就是自身的方法名
35 | //app=当前vue对象,可以通过console.log(app)查看当前所有的变量
36 |
37 | //this域
38 | //如果是add,edit,delete this域 是空的
39 | //如果是自定义按钮,this域是自定义按钮的配置信息
40 |
41 | //返回true,代表后续步骤还是由simplepro处理
42 | return true
43 | },
44 | loadData:function(app){
45 | //加载数据的时候触发
46 | //改变app某些参数的时候 建议在此方法进行,init中改后,重新加载数据将会对某些值进行覆盖
47 | }
48 |
49 | //其他例如formatter这一类,在ModelAdmin中已经提供
50 | }
51 |
52 | ```
--------------------------------------------------------------------------------
/setup.md:
--------------------------------------------------------------------------------
1 | # simplepro 安装指南
2 |
3 | simplepro 依赖 simpleui、django-export-import、以及django
4 |
5 |
6 | 1. 安装simplepro
7 |
8 | ```shell
9 | pip install simplepro
10 | ```
11 |
12 | 2. INSTALL_APPS中配置
13 |
14 | > 按以下顺序加入到INSTALL_APPS数组的顶部
15 | ```python
16 | INSTALLED_APPS = [
17 | 'simplepro',
18 | 'simpleui',
19 | 'import_export',
20 | ......
21 | ]
22 | ```
23 | 3. 配置中间件
24 |
25 | ```python
26 | MIDDLEWARE = [
27 | 'django.middleware.security.SecurityMiddleware',
28 | 'django.contrib.sessions.middleware.SessionMiddleware',
29 | 'django.middleware.common.CommonMiddleware',
30 | 'django.middleware.csrf.CsrfViewMiddleware',
31 | 'django.contrib.auth.middleware.AuthenticationMiddleware',
32 | 'django.contrib.messages.middleware.MessageMiddleware',
33 | 'django.middleware.clickjacking.XFrameOptionsMiddleware',
34 | # 加入simplepro的中间件
35 | 'simplepro.middlewares.SimpleMiddleware'
36 | ]
37 | ```
38 |
39 | + 如果在开启DEBUG模式后,启动即可运行。
40 | + 如果关闭后,需要克隆静态文件,步骤与simpleui一致。[文档地址](https://github.com/newpanjing/simpleui/blob/master/QUICK.md#%E5%85%8B%E9%9A%86%E9%9D%99%E6%80%81%E6%96%87%E4%BB%B6%E5%88%B0%E6%A0%B9%E7%9B%AE%E5%BD%95)
--------------------------------------------------------------------------------
/home.md:
--------------------------------------------------------------------------------
1 | # simplepro定制首页
2 | simplepro首页默认了较多的模块,也许某些你无法用上。所以该文档提供了如何定制。
3 |
4 | simpleui采用框架结构,simplepro也是基于simpleui,simpleui的首页文件home.html
5 |
6 | 只要重新该页面即可。
7 |
8 | 重新有两种方式,第一种全覆盖,第二种block方式
9 |
10 | ## 全覆盖方式
11 | 在你的项目的templates目录中建立以下文件结构
12 | ```
13 | ├─templates
14 | │ ├─admin
15 | │ │ ├─home.html
16 | ```
17 | home.html内容:
18 | ```html
19 | {% load i18n static simpletags %}
20 |
21 |
22 |
23 |
24 | {% block quick %}
25 | {% include 'admin/parts/quick.html' %}
26 | {% endblock %}
27 |
28 | {% block chart_cards %}
29 | {% include 'admin/parts/charts_cards.html' %}
30 | {% endblock %}
31 |
32 | {% block line_chart %}
33 | {% include 'admin/parts/line_chart.html' %}
34 | {% endblock %}
35 |
36 | {% block info %}
37 | {% include 'admin/parts/info.html' %}
38 | {% endblock %}
39 |
40 |
41 |
42 |
43 |
44 | ```
45 | 你可以完全拷贝内容,到新建的home.html中,挑选需要的include部分。
46 |
47 | ## 继承block方式
48 | 也需要在templates->admin->home.html中建立文件
49 | html内容:
50 |
51 | ```html
52 | {% extends 'admin/home.html' %}
53 | {% block quick %}
54 | //...这里重新你的内容
55 | {% endblock%}
56 |
57 | ```
58 | block方式文档请参考django的文档。
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # simplepro
2 | Simple UI Pro 专业版simple UI 前后端分离,功能更多界面更美观!
3 |
4 | ## 在Demo
5 | [http://175.178.229.216:9001/](http://175.178.229.216:9001/)
6 |
7 | ## 本地 Simple Pro Demo
8 | [https://github.com/newpanjing/simplepro_demo](https://github.com/newpanjing/simplepro_demo)
9 |
10 | ## 官网
11 | [https://www.noondot.com/](https://www.noondot.com/)
12 |
13 | ## QQ群:786576510
14 | > Simple Pro是基于simpleui的升级版,需要依赖simpleui
15 |
16 |
17 |
18 |
19 | Simple Pro是收费项目,如果不想付费请继续使用[Simpleui](https://github.com/newpanjing/simpleui)我们也会将开源免费的项目维护到底。收费的目的是为了让simpleui和simplepro能够更好的维护下去。
20 |
21 |
22 |
23 | ## 预览图
24 | + 可自定义主题
25 |
26 |
27 | + 可以搜索模块
28 |
29 |
30 | + vue+element-ui 前后端分离加载数据
31 |
32 |
33 | + 编辑页面
34 |
35 |
36 | + 导出数据
37 |
38 |
39 | + 导入插件
40 |
41 |
42 | + 导出插件
43 |
44 |
45 | + 自定义权限
46 |
47 |
48 |
49 | ## 付费和激活
50 | 可以先直接安装simplepro,启动项目后打开后台会有相关提示页面,根据提示页面操作即可激活。
51 |
52 | ## 主要功能:
53 | 以下列出的功能,均是在simpleui的基础上进行的
54 |
55 | ### 页面
56 | - 首页改版
57 | - 登录页改版
58 | - 列表页改版
59 | - 权限页改版
60 | - 导入页和导出页改版
61 | - 增加网页全局进度条
62 | - 替换全局部分图标
63 | - Pro版独有标识
64 | - 专业版主题
65 | - 优化最近动作和主题,改为侧栏显示
66 | - 优化返回按钮,改为绝对路径 通过reverse('admin:demo_employe_add')
67 | - 全新默认LOGO
68 | - 首页增加图表
69 |
70 | ### 功能
71 | - 自定义按钮ajax实现
72 | - 筛选、删除、搜索、表格ajax加载数据
73 | - 导入导出优化
74 | - 权限模块重写
75 | - 表格功能增加详见table.md文档
76 | - 自定义主题
77 |
78 | ### 权限
79 | - 可添加自定义权限
80 | - 自定义按钮权限控制
81 | - 自定义菜单权限控制
82 | - 自定义字段权限
83 |
84 | ## 文档
85 | + [安装步骤](/setup.md)
86 | + [主页](/home.md)
87 | + [图表](/charts.md)
88 | + [自定义按钮](/action.md)
89 | + [自定义权限](/permissions.md)
90 | + [导入导出插件](/export_import.md)
91 | + [表格配置](/table.md)
92 | + [JS SDK](/jssdk.md)
93 |
94 |
95 | # 插件兼容
96 | + django_apscheduler
97 | + django-import-export
98 |
99 | 以上两个插件做了特定的兼容,其他插件也可以兼容。
100 |
101 |
102 | # 隐藏 simplepro 版本和授权信息
103 |
104 | 请在settings.py中加入:
105 | ```python
106 | SIMPLEPRO_INFO = False
107 | ```
108 |
--------------------------------------------------------------------------------
/charts.md:
--------------------------------------------------------------------------------
1 | # simplepro 图表说明
2 |
3 | 图表类型与配置完全遵循echarts4.x 具体效果请看echarts的文档,simplepro只是做了个基于dom的封装,原生的写法在vue中无法渲染,会出现页面空白。
4 |
5 | simpleui的图表采用echarts4.x,echarts的具体配置请移步至[https://www.echartsjs.com/zh/index.html](https://www.echartsjs.com/zh/index.html)查看
6 |
7 | ## 如何配置
8 | 由于simpleui和simplepro是基于vue开发,所以echarts在simplepro中进行了封装。直接在home页面引用echarts既可。
9 | ```html
10 |
11 |
12 |
13 | ```
14 | ### 参数说明:
15 | |参数|说明|
16 | |---|---|
17 | |option|option字段完成与echarts的option一致,封装的过程中没有做任何处理。|
18 | |style|和原生dom的style一致,没有做任何处理,但是必须指定height,否则将不能正常显示图表|
19 |
20 | ### 例子
21 |
22 | ```html
23 |
109 |
110 |
111 | ```
112 |
113 | 以上方式是静态渲染,需要在页面输出数据。但是这样往往无法满足需求。所以动态渲染也是同样支持的。
114 |
115 | ### 动态渲染
116 | 如果想动态改变数据,可以把option交由最外层的vue实例管理,把本页定义的option1先删除
117 |
118 | 然后定义在app中:
119 | ```js
120 | app.option1={};
121 | ajax(function(data){
122 | app.option1=data;
123 | });
124 | ```
125 |
126 | ### 注意
127 | 注意,如果在子页面实现,需要自行引入echarts的js文件。然后在引入
128 |
129 | 例如:
130 | ```html
131 |
132 |
133 |
134 | ```
135 | 以上三个文件缺一不可。
--------------------------------------------------------------------------------
/table.md:
--------------------------------------------------------------------------------
1 | # simplepro 表格
2 | simplepro table基于elementui table,设置主要来自ModelAdmin,写法与原生admin一致,但是在原生的基础上增加了和减少了部分字段。注意目前table仅支持下列这些字段,但是在编辑和添加页还有用到其他字段,请参考原生admin与simpleui,simplepro是完全基于simpleui的。
3 |
4 | # ModelAdmin部分
5 |
6 | ## 自定义按钮
7 |
8 | admin中的自定义actions也是支持的,也就是simpleui说说的自定义按钮。
9 |
10 | 定义方法和使用均与原生admin一致,不过simpleui在这基础上进行了扩展。可以参考[自定义按钮文档](./action.md)
11 |
12 | ## 字段
13 | |字段|类型|说明|
14 | |---|---|---|
15 | |list_display|tuple|table显示的字段|
16 | |search_fields|tuple|搜索框搜索的字段|
17 | |list_per_page|int|每页显示的数量|
18 | |list_filter|array|筛选字段|
19 | |list_display_links|显示连接进入编辑页的字段|
20 | |fields_options|dict|表格的表头字段设置|
21 | |actions_show|boolean|显示隐藏action,默认为True,只有显式指定为False的时候才隐藏|
22 | |actions|array|[自定义按钮](#自定义按钮)|
23 |
24 | # 字段互斥
25 | > list_display_links 字段与formatter方法互斥
26 |
27 | 如果有formatter方法,list_display_links中配置的字段将无任何作用。
28 |
29 | ### fields_options字段
30 | admin 中字段设置,及时list_display 未定义该字段,在这里设置了也不会出错
31 | 表头字段完全遵循elementui的table文档:
32 |
33 | [https://element.eleme.cn/#/zh-CN/component/table](https://element.eleme.cn/#/zh-CN/component/table)
34 |
35 | fields_options支持自定义字段的值,比如model中的自定义方法 就算自定义字段
36 |
37 | ### 目前支持以下属性
38 |
39 | |字段|类型|说明|
40 | |---|---|---|
41 | |fixed|str|固定列,取值 left 和right|
42 | |sortable|boolean|排序字段,默认为'custom'|
43 | |width|str|宽度,取值例如100px|
44 | |min_width|str|最小宽度,取值例如100px|
45 | |resizable|boolean|列是否可以调整宽度|
46 | |class_name|str|列的 className|
47 | |label_class_name|str|当前列标题的自定义类名|
48 |
49 | + sortable字段
50 |
51 | 排序字段,默认为'custom',取值为: true, false, 'custom'
52 |
53 | 其中为custom的时候网络排序
54 |
55 | 取值为true,本地排序
56 |
57 | 自定义字段该值始终为false不排序
58 |
59 | ### fields_options例子
60 |
61 | ```python
62 | fields_options = {
63 | 'id': {
64 | 'fixed': 'left',
65 | 'width': '80px',
66 | 'align': 'center'
67 | },
68 | 'create_time': {
69 | 'fixed': 'right',
70 | 'width': '200px',
71 | 'align': 'left'
72 | }
73 | }
74 | ```
75 |
76 | ## 方法
77 |
78 | |字段|类型|说明|
79 | |---|---|---|
80 | |delete_queryset|function|删除时触发该方法|
81 | |formatter|function|数据格式化|
82 | |get_queryset|function|获取自定义的queryset|
83 | |get_list_display|function|获取自定义的list_display|
84 | |get_list_filter|function|获取自定义的list_filter|
85 | |get_actions|function|获取自定义的actions|
86 |
87 |
88 | ### formatter 方法
89 | + 入参
90 |
91 | |字段|类型|说明|
92 | |---|---|---|
93 | |obj|object|当前对象|
94 | |field_name|str|字段名|
95 | |value|object|字段值|
96 |
97 | + 返回
98 |
99 | 返回参数为单元格显示的值,可以是html,可以是文本。
100 |
101 | ### formatter例子
102 | ```python
103 | def formatter(self, obj, field_name, value):
104 | # 这里可以对value的值进行判断,比如日期格式化等
105 | return value
106 | ```
107 |
108 | ### delete_queryset 说明
109 |
110 | 例子:
111 |
112 | ```python
113 | def delete_queryset(self, request, queryset):
114 | #这里可以做些自定义的处理
115 | pass
116 | ```
117 | + 返回
118 |
119 | 如果返回的是queryset,那么程序将会调用delete方法执行删除。如果返回的是None,将不会做任何动作
120 |
121 |
122 |
123 | ## get_queryset 说明
124 |
125 | 例子:
126 |
127 | ```python
128 | def get_queryset(self, request):
129 | qs = super().get_queryset(request)
130 |
131 | return qs.filter(id__gte=1)
132 | ```
133 |
134 | 注意,get_queryset可以返回为None,包括pass也是返回为None。如果为None,的时候 该queryset将会被丢弃,框架将会从model中获取queryset
135 | ```python
136 | qs=model.objects.get_querset()
137 | ```
138 |
139 | 可以利用这个方法来控制自定义的数据权限,该方法与原生admin一致。
140 |
141 | ## get_list_display 说明
142 |
143 | ```python
144 | def get_list_display(self, request):
145 | # 这里可以进行判断,动态返回某些字段或表头
146 | return self.list_display
147 | ```
148 | ## get_list_filter 说明
149 |
150 | ```python
151 | def get_list_filter(self, request):
152 | # 这里可以进行判断,动态返回list_filter
153 | return self.list_filter
154 | ```
155 | ## get_actions 说明
156 |
157 | ```python
158 | def get_actions(self, request):
159 | # 这里可以进行判断,动态返回actions
160 | actions = super(EmployeAdmin, self).get_actions(request)
161 | return actions
162 | ```
163 |
164 | ## Media 自定义引入js和css
165 |
166 | Media 遵从原生django admin的写法,并且处理也是django实现,simplepro未做任何文件处理,只做引入动作。
167 |
168 | 例子:
169 |
170 | ```python
171 |
172 | @admin.register(Department)
173 | class DepartmentAdmin(admin.ModelAdmin):
174 |
175 | class Media:
176 | js=('aa.js','bb.js')
177 | css=('dd.css','cc.css')
178 |
179 | ```
180 |
181 | 在页面解析的时候 会调用下列方式进行引入
182 | ```html
183 |
194 | {% endfor %}
195 | {% endif %}
196 | ```
197 |
198 | 引入css部分:
199 |
200 | ```html
201 | {% if media.css %}
202 | {% for css in media.css %}
203 |
204 | {% endfor %}
205 | {% endif %}
206 | ```
207 |
208 | 在通过引入自己的js和css之后,可以对页面进行扩展,调用simplepro的js sdk 可以实现意想不到的效果,比如表格format,添加自定义按钮,拦截按钮事件等。具体请看jssdk
209 |
--------------------------------------------------------------------------------
/permissions.md:
--------------------------------------------------------------------------------
1 | # simplepro 自定义权限
2 |
3 | + 在simpleui中没有提供自定义权限的支持。
4 | + 在原生django admin中没有提供自定义菜单权限的支持,自定义按钮权限支持。
5 |
6 | # 权限基础知识
7 |
8 | simplepro的权限 也是在django admin的权限中进行扩展的。但是未更改django 权限相关的任何字段。
9 |
10 | ## 表结构
11 |
12 | |表名|名字|作用|
13 | |---|---|---|
14 | |django_content_type|模块类型表|用于记录用户和admin的各个模块|
15 | |auth_permission|权限表|用户记录所有模块的view,add,change,delete权限,与django_content_type关联|
16 | |auth_group|权限组|每个用户都可以指定一个或多个权限组,与auth_group_permissions关联|
17 |
18 | 以上三个表就是权限的基础表结构,通过表格或者`model`的`permission`字段所添加的权限,都会往`auth_permission`表中存入数据。
19 |
20 |
21 |
22 | # 自定义按钮权限
23 |
24 | 自定义权限包括自定义按钮和自定义菜单,django admin中 对自定义的action 也就是自定义按钮提供了权限支持,定义如下:
25 |
26 |
27 | ## 注意:下面这种方式在simplepro中和原生admin中通用,simpleui中不适用。
28 |
29 | ## 1.定义
30 |
31 | ```python
32 |
33 | # admin
34 | @admin.register(Employe)
35 | class EmployeAdmin(admin.ModelAdmin):
36 | #....定义显示字段之类
37 |
38 | actions=[test]
39 |
40 | # 自定义按钮
41 | def test(self, request, queryset):
42 | # 这里可有做一些crud
43 | pass
44 |
45 | test.short_descript='按钮显示的名'
46 |
47 | # model
48 | class Employe(models.Model):
49 | name = models.CharField(max_length=128, verbose_name='名称', help_text='员工的名字', null=False, blank=False,
50 | db_index=True)
51 |
52 | gender_choices = (
53 | (0, '未知'),
54 | (1, '男'),
55 | (2, '女'),
56 | )
57 |
58 | gender = models.IntegerField(choices=gender_choices, verbose_name='性别', default=0)
59 |
60 | class Meta:
61 | verbose_name = "员工"
62 | verbose_name_plural = "员工管理"
63 |
64 | # 定义自定义的权限
65 | permissions = (
66 | ('test', 'test111'),
67 | ('test2', 'test222'),
68 | ('权限显示的名称','权限判断的codename'),
69 | ('测试按钮','test') # 注意 这里的test要与admin中的按钮方法名一致
70 | )`
71 |
72 | ```
73 |
74 | ## 2.迁移
75 |
76 | + 生成迁移文件
77 |
78 | ```shell
79 | python3 manage.py makemigrations
80 | ```
81 | + 执行迁移,添加到数据库
82 |
83 | ```shell
84 | python3 manage.py migrate
85 | ```
86 |
87 | ## 3.勾选权限
88 | 在操作完以上两个步骤后,我们可以进入到`认证和授权->组`或者`认证和授权->权限`中,对用户勾选该项权限。
89 |
90 | ## 4.其他操作
91 |
92 | 在`认证和授权->权限`该项菜单中,可以直接用表格形式添加。可以不用写在model中,但是这种方式容易遗漏,不推荐使用。
93 |
94 |
95 | > 以上的步骤是自定义按钮的权限控制,下面的步骤中定义自定义菜单的权限稍微复杂一些。
96 |
97 | # 自定义菜单权限
98 |
99 | 自定义菜单的权限定义方式有2种
100 | 1. 第一种和自定义按钮一样,定义在model中,但是前提是自定义按钮的`codename`字段要与model的`codename`一致,比较麻烦。
101 |
102 | 2. 第二种,直接在`认证和授权->权限`该项菜单中,用表格的形式直接添加。但是菜单的codename要与`内容类型`的codename一致。
103 |
104 | ## 如何查看app_label?
105 | 可以打开表:`django_content_type`进行查看。
106 |
107 | 自定义菜单权限:
108 |
109 | 例子1,在model中的方式:
110 |
111 | model:
112 |
113 | ```python
114 |
115 | class Employe(models.Model):
116 | name = models.CharField(max_length=128, verbose_name='名称', help_text='员工的名字', null=False, blank=False,
117 | db_index=True)
118 |
119 | gender_choices = (
120 | (0, '未知'),
121 | (1, '男'),
122 | (2, '女'),
123 | )
124 |
125 | gender = models.IntegerField(choices=gender_choices, verbose_name='性别', default=0)
126 |
127 | class Meta:
128 | verbose_name = "员工"
129 | verbose_name_plural = "员工管理"
130 |
131 | # 定义自定义的权限
132 | permissions = (
133 | ('test', 'test111'),
134 | ('test2', 'test222'),
135 | ('权限显示的名称','权限判断的code'),
136 | ('测试按钮','test'), # 注意 这里的test要与admin中的按钮方法名一致
137 | ('Simpleui','view_simpleui')
138 | )`
139 |
140 | ```
141 | > 添加了之后别忘记执行迁移
142 |
143 |
144 | settings.py中的菜单定义:
145 | ```python
146 |
147 | SIMPLEUI_CONFIG = {
148 | # 在自定义菜单的基础上保留系统模块
149 | 'system_keep': True,
150 | 'menus': [{
151 | 'name': 'Simpleui',
152 | 'icon': 'fas fa-code',
153 | 'url': 'https://gitee.com/tompeppa/simpleui',
154 | 'codename':'simpleui'
155 | }, {
156 | 'name': '测试',
157 | 'icon': 'fa fa-file',
158 | 'codename': 'test',
159 | 'models': [{
160 | 'name': 'Baidu',
161 | 'url': 'http://baidu.com',
162 | 'icon': 'far fa-surprise',
163 | 'codename':'baidu'
164 | }, {
165 | 'name': '内网穿透',
166 | 'url': 'https://www.wezoz.com',
167 | 'icon': 'fab fa-github',
168 | 'codename':'nat'
169 | }, {
170 | 'name': '内网穿透',
171 | 'url': 'https://www.wezoz.com',
172 | 'icon': 'fab fa-github'
173 | }, {
174 | 'name': '登录页嵌套测试',
175 | 'url': '/login'
176 | }]
177 | }]
178 | }
179 |
180 | ```
181 |
182 | 以上定义了两种菜单,一个是只有一级,一个是有2级
183 |
184 | + 一级的 权限key=codename.codename也就是 simpleui.simpleui
185 | + 二级的 权限key=test.baidu test.nat
186 |
187 | 主要保证这些数据在auth_permission中,权限就可以正常进行,否则将不受权限控制.
188 |
189 | 如果父级没有codename 及时子级写了codename 也不权限控制
190 |
191 | 自定义菜单如果是最顶级,需要在`内容类型->内容类型`菜单中添加一条数据。
192 |
193 | ## 不生效排查
194 |
195 | 1. 请保证 `request.user.get_all_permissions()` 该方法中有自定义的权限
196 | 2. 顶级菜单的权限是否存在,例如test.test 如果该项权限没有,子级也不会显示
197 |
198 |
199 | # 导入导出权限
200 |
201 | 导入 key=model.import
202 |
203 | 导出 key=model.export
204 |
205 |
206 | # FAQ常见问题
207 |
208 | + PermissionError: [Errno 13] Permission denied
209 |
210 | 请请检查是否对python lib目录有访问权限,linux和Windows默认用普通用户,对全局python lib包没有写的权限,所有会提示权限问题。建议用虚拟环境运行。
211 |
212 | + 无法获取套餐列表
213 |
214 | 请检查是否能访问simpleui.88cto.com
215 |
216 | ```shell
217 | ping simpleui.88cto.com
218 | ```
219 |
220 | 如果被防火墙屏蔽,请采用hosts的方式,在hosts文件中加入:
221 | ```
222 | 103.39.210.34 simpleui.88cto.com
223 | ```
--------------------------------------------------------------------------------