写在前面
博主近期在肝Django web的开发,虽然很多东西依然看不懂,但也得继续肝。目前看到admin后台管理系统这一章。
Django开发自带的管理系统本身功能已经很强大,但每个项目的管理系统不可能千篇一律,因此,可以对这个admin系统进行二次开发。
本博客对应《Django Web应用开发实战》9.4节的内容,做个学习过程的记录。
编译环境:
- python 3.7
- pycharm 2020
- Django 3.0.8
不同账户的管理权限
新增账户管理
超级管理员账户创建
在进行后台管理之前,首先要创建一个超级管理员账号,超级管理员的创建方法是由Django的createsuperuser指令来创建的。在pycharm的终端模式下输入以下指令:
python manage.py createsuperuser
接下来,会依次让你输入username、email address、password(两遍),密码必须设置的稍微复杂一点,username、email address都可以为空,如果username为空的话,账号名就是你的电脑名。
创建后,我们再运行Django项目,登录的话,就会提示用账号登录了。如下登录界面。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-26MK5BiT-1627541041327)(C:\Users\HP\AppData\Roaming\Typora\typora-user-images\image-20210729135741826.png)]
一般账户创建
进行基础的设置主页后,登录超级管理员账号,可以显示如下界面:
点击认证和授权下面的用户-添加,即可创建其他账号,如下:
创建完成后,要分配给这个账号相关的权限,继续看下面的图:
也就是说,我创建的这个账户,除了不是超级管理员以外,具备所有的管理权限。
修改新增账号的管理权限
首先看一下我们的数据库
如果我不想让这个新增的管理员管理payment这个字段,那我该如何处理呢?
这里要用到get_readonly_fields()
这个函数,它获取readonly_fields()
的属性值,从而将模型字段设为只读属性,可以重写这个函数来自定义模型字段的只读属性。也就是上面说的,只能看,不能改。
代码在admin.py中重写这个函数,重写方法如下:
@admin.register(Vocation)
class VocationAdmin(admin.ModelAdmin):
"""
fieldsets = (
('职业信息', {
'fields': ('job', 'title', 'payment')
}),
('人员信息', {
# 设置隐藏与显示
'classes': ('collapse',),
'fields': ('person',),
}),
)
radio_fields = {'person': admin.HORIZONTAL}
ordering = ['id']
sortable_by = ['job', 'title']
"""
list_display = ['id', 'job', 'title', 'person', 'payment', 'colored_name']
"""
list_filter = ['job', 'title', 'person__name']
list_per_page = 100
list_max_show_all = 200
list_editable = ['job', 'title']
search_fields = ['job', 'title']
date_hierarchy = 'recordTime'
save_as = True
actions_on_top = False
actions_on_bottom = True
"""
def get_readonly_fields(self, request, obj=None):
if request.user.is_superuser:
self.readonly_fields = []
else:
self.readonly_fields = ['payment']
return self.readonly_fields
运行Django项目,当我们用超级管理员账号登录时,想要修改职业信息,看到如下界面:
当我用新建的账号登录时,进行同样的操作,看到的界面如下:
payment这个字段是无法修改的,是只读状态。
这样,我们就创建了一个一般的管理员账号,并设定了它的权限。
因后面内容比较多,类似的我就只记录代码,不记录图片了。
设置字段样式
字段样式的修改是在模型中设置的,在Vocation类下自定义函数,进行样式修改即可,代码如下:
def colored_name(self):
if 'Lucy' in self.person.name:
color_code = 'red'
else:
color_code = 'blue'
return format_html(
'<span style="color: {};">{}</span>',
color_code,
self.person.name,
)
colored_name.short_description = '带颜色的姓名'
上面这个函数设置了外键字段的颜色。
重写保存函数
也就是重写save_model()函数,在新增或者修改数据的时候,单击界面上的”保存“按钮时触发的功能,我们进行二次开发,可以重写这个函数,实现自己的想要的功能,比如实现修改日志的记录。
在admin.py中重写该函数,修改代码如下:
def save_model(self, request, obj, form, change):
if change:
# 获取当前用户名
user = request.user.username
# 使用模型获取数据,pk代表具有主键属性的字段
job = self.model.objects.get(pk=obj.pk).job
# 使用表单获取数据
person = form.cleaned_data['person'].name
# 写入日志文件
f = open('d://log.txt', 'a')
f.write(person + '职位:' + job + ',被' + user + '修改' + '\r\n')
f.close()
else:
pass
# 使用super在继承父类已有的功能下新增自定义功能
super().save_model(request, obj, form, change)
其实有个问题还一直没有理解清楚,就是重写函数时,这个super()到底该怎么写,暂时先记录在这里,以后慢慢再学。
执行修改职位信息后,记录在log.txt文件中,如下:
数据批量操作
我们来看看上面出现过的这张图:
看我框出来的地方,本身是只有上面那个“删除所选的职业信息”这一项的,“导出所选数据”就是通过二次开发加进去的。
这种操作属于数据批量处理,可以在“动作”栏中自定义函数,如何实现呢,看下面代码,同样在admin.py的VocationAdmin类下添加如下函数:
def get_datas(self, request, queryset):
temp = []
for d in queryset:
t = [d.job, d.title, str(d.payment), d.person.name]
temp.append(t)
f = open('D:\\DjangoProjects\\MyDjango\\data.txt', 'a')
for t in temp:
f.write(','.join(t)+'\r\n')
f.close()
self.message_user(request, '数据导出成功')
get_datas.short_description = '导出所选数据'
actions = ['get_datas']
注意,这个函数不是重写了,因此函数名是可以自己来设置的,在写完这个函数后,get_datas.short_description
设置这个功能的简称,actions = ['get_datas']
则是把这个功能加入到ModelAdmin的内置属性actions中去,在动作栏生成数据批量处理功能。
运行项目,选中数据,并选择“导出所选数据”,点击执行按钮,如下流程:
在项目文件夹的data.txt里面写入如下内容:
总结
admin的二次开发内容还挺多的,书中介绍的内容也不止这么多。
仍然有很多不太明白的地方,比如哪些可以通过重写来实现,哪些不需要重写而是自定义,重写的时候继承父类的方式各不一样,有的有return,有的不需要return,这些都还不熟悉。
继续学习吧。