使用Django意味着后台框架的几乎所有内容都会和Django产生互动,排除功能全部手撸的情况.
Django 后台admin有大量的属性和方法,拥有强大的功能和自定义能力.通过完整的代码来看Django admin的基础设置和高级用法,并结合form表单来实现深度自定义.
简单使用
如果只是使用admin自带的数据管理功能,只需要将模型注册到admin中,就可以实现.
1 2 3 4 5 |
|
Django后台会将对应数据表的所有字段进行展示,默认点击 id 会进入修改页面,对应 change_form.html 模板.
自定义admin类
使用admin也可以自定义一个admin的类,来自定义后台实现的属性和方法,然后通过 register() 来将自定义的类和模型注册在一起.
注册方式有两种,一种是使用类装饰器,一种是使用 site
1 2 3 4 5 6 7 8 9 |
|
admin显示属性的设置
ModelAdmin中的属性设置
admin可以设置在列表页和详情页显示的字段以及搜索字段等的限制,在admin的类中可以直接定义.
以使用较多的 ModelAdmin 为例, ModelAdmin 源码中的属性有:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
|
模板的定制
指定自定义模板
在ModelAdmin中自带了几个指定模板的属性,可以自己定义HTML文件,来指定给某个模板页面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
重写自带模板
在django admin里面有自己写好的模板,include模板,每个app也有对应的模板
admin的自带模板在项目的 django/contrib/admin/templates/admin ,目录下面
include 文目录下是 include 语法包含的模板。
change_form.html 是数据修改页面的模板,如果想在数据详情页面自定义显示的内容,可以自定义这个页面
模板使用的全都是模板语法,注意模板语法的继承机制,在当前页面重写的元素,不会直接显示。
fieldset.htlm 是拼接成详情页的块。前面提到,自定义admin类中的 fieldset 属性,可以自定义详情页,使数据字段分块显示,就是改变了传给这个页面的值。
例如,使用 if 语句来动态添加jQuery和 div 标签,只有在访问某个app的数据时添加
1 2 3 4 5 6 7 8 |
|
结合form表单
django admin结合form表单,重写 fieldset.html 来实现数据详情页面的深度自定义,通过处理form表单提交的数据,来实现后台功能的完全自定义。
django的admin中可以指定form类,来自定义显示的内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
注意:在form表单中动态生成的属性,必须使用 fields='__all__‘ 属性,否则不会显示,可以结合 exclude 属性来控制需要显示的表单
然后在admin中注册form类
1 2 3 4 5 6 |
|
自定义列表页来源
除了可以通过修改admin的属性,来实现列表页展示字段的自定义,也可以对列表页数据进行筛选,例如,筛选出活跃的用户等,这个可以在 action 中定义新的方法
也可以重写admin中的 get_queryset 方法,返回的qs是重新筛选之后的数据,可以避免一些业务逻辑上的误操作
这里的代码展示了,在列表页,展示其他表中的数据,注册模型表的数据没有展示
1 2 3 4 5 6 7 |
|
给admin类定义form属性之后,在详情页面传回的数据,会带上form表单里面的数据,然后结合业务逻辑处理这个数据
例如,业务场景,接受form数据,保存到其他几张表,对于展示数据的表,不进行任何操作,那就需要重写 save_model 方法,这个方法调用了模型的 save 方法
重写这个方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
扩展
在 get_queryset 方法中,展示类模型中的统计数据,这个统计数据,不是在数据库中生成的,实在模型类中定义的方法,这个方法的返回值,可以在列表页中直接展示。例如上文中说道的标签的个数
同时,也可以返回一个HTML标签,模板语法中获取这个字段时,得到的是一个HTML标签,直接渲染
1 2 3 4 5 6 7 8 9 10 |
|