Django Admin的二次开发

写在前面

博主近期在肝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,这些都还不熟悉。

继续学习吧。

猜你喜欢

转载自blog.csdn.net/u012848304/article/details/119211125