DRF的Admin站点

文章介绍了Django内置Admin组件的使用,包括其强大的用户认证和权限分配系统,以及如何通过自定义`admin.py`进行列表页和详情页配置,同时提到了如何通过如simpleUI这样的工具进行后台界面美化。
摘要由CSDN通过智能技术生成

Admin

django内置了一个强大的组件叫Admin,提供给网站管理员快速开发运营后台的管理站点。

提醒:虽然django内置的运营站点功能齐全,但是在实际工作中如果要实现高定制性后台运营站点,很多公司都是自己另行自己从0开始搭建的或使用第三方组件对Admin进行增强美化。

站点文档: Django 管理站点 | Django 文档 | Django

注意:要使用Admin,必须先创建超级管理员。
python manage.py createsuperuser

admin站点默认并没有提供其他的操作给我们,所以一切功能都需要我们进行配置,在项目中,我们每次创建子应用的时候都会存在一个admin.py文件,这个文件就是用于配置admin站点功能的文件。这些admin.py最终都会被项目运营的时候被django所加载并识别。

一般而言,我们在开发中经常以下几个术语:
1. 前台站点
   一个独立站点,这个站点和后台站点共用了一个数据库,甚至在一个目录下,大家一起运行。
   前台站点一般是允许任何人进行注册,登录并访问。我们在网络中经常访问的网站基本都是各种网站的前台站台。
   例如:京东、淘宝、

2. 后台站点
   也是一个独立站点,这个站点和前台站点共用了一个数据库,甚至在一个目录下,大家一起运行。
   后台一般是提供公司内部不懂代码的工作人员,方便这些人更好的维护或对站点已有的数据库中的内容进行增删查改用的

在绝大部分情况下,我们所说的一个项目,往往都会涵盖了前台和后台站点,除了OA,CRM,ERP类似这种内部企业项目以外。
不管是前台站点或者后台站点,都是由前端代码(html,css,js)和后端代码(python,java,c++,go,php,.net,C#)所实现的。

3. 前端开发
   指代就是客户端开发: web前端,移动端开发,游戏客户端开发
   web前端: 使用基于http获取服务端数据提供给客户端展示的这一类的开发。目前来说,绝大部分指代的就是js,....
   移动端开发:js,andorid,IOS。。
   游戏客户端:C++,js,java,。。

4. 后端开发[服务端开发]
   python,java,c++,go,php,.net,C#,rust

django的admin站点在没有经过任何配置的之前,就已经实现了目前业内来说比较完善的用户认证机制和权限分配系统了。

用户认证机制:基于django.contrib.auth子应用对外提供的。里面有内置的视图,模板,模型等等。

已经实现了关于管理员的登录,退出,修改密码等等。

权限认证系统:基于django.contrib.auth子应用对外提供的。里面基于模型完成了基于RBAC的权限认证机制.

RBAC权限认证机制

实现了权限认证机制以后,我们可以让不同的用户得到不同的权限,基于用户拥有的权限不同,能操作的功能或者能看到的站点内容也会产生不一样。

RBAC(Role-Base Access Control 的缩写),译作:基于角色分配的访问控制机制。

在开发中,我们一般用于项目权限的分配机制无非3种:RBAC,OAuth授权认证、RLS(Row Level Security的缩写、译作:行级数据安全)。

在网站后台运营站点这种单个站点内部,单个站点集群场景下,一般使用的都是RBAC。

在对外开发的业务站点中,基于不同的渠道,不同的领域,不同站点之间,一般都是使用OAuth2.0授权认证。

在对外开发的站点服务,如果配置多台前后台的租赁模式,多数使用RLS权限机制。

RBAC的实现

在实现过程中,因为项目业务的复杂程度不一致。所以存在有3表RBAC或5表RBAC的实现方案。

django的admin站点实际上就是基于5表RBAC的实现方案扩展出来的6表RBAC认证机制。

3表RBAC认证

顾名思义,就是使用了3张表保存了权限相关的所有数据,这3张表分别是用户表(user),角色表(role/group/department),权限表(permission/auth)

常见的场景:单个网站:小论坛,小商城,普通的后台站点。

5表RBAC认证

顾名思义,就是在3表的基础上新增了2张关系表保存权限相关的所有数据,这5张表分别是用户表(user),角色表(role/group),权限表(permission/auth),以及新增的2张关系表:用户与角色之间的关系表(user_group)和角色与权限的关系表(group_permission)。

常见的业务场景:大型综合论坛,大型的商城(商家入驻),有分公司的企业内部站点,OA、ORM、ERP、权限系统。

Django的RBAC

是在传统的5表RBAC基础上,增加了一个关系表,用户与权限之间的关系表(user_permission)。

因为RBAC的本质是用户随着角色不同,而拥有不同的权限,而django的admin站点中,允许针对某一个用户,可以单独分配权限的。

admin.py里面允许我们编写的代码一共可以分成2部分:

列表页配置

主要用于针对项目中各个子应用里面的models.py里面的模型,根据这些模型自动生成后台运营站点的管理功能。

admin.py,代码:

from django.contrib import admin
from .models import Student
# Register your models here.


class StudentModelAdmin(admin.ModelAdmin):
    """学生的模型管理器"""
    pass

# admin.site.register(模型类, 模型管理类)
admin.site.register(Student, StudentModelAdmin)

子应用的英文名改成中文显示,apps.py,代码:

from django.apps import AppConfig


class StuapiConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'stuapi'
    verbose_name = "学生管理"
    verbose_name_plural = verbose_name

关于列表页的配置,admin.py,代码:

from django.contrib import admin
from .models import Student

class StudentModelAdmin(admin.ModelAdmin):
    """列表页配置"""
    # 列表列显示的数据字段[值可以是模型的字段,也可以是模型的方法名(方法不能有参数)]
    list_display = ["id", "name", "classmate", "age", "sex", "sex_text", "born"]
    # 设置点击哪些字段可以跳转到详情页
    list_display_links = ["id"]

    # 默认排序[值只能是模型字段,不能是模型方法]
    ordering = ['-age','id']
    # 动作栏是否在上下方显示
    actions_on_top = True     # 上方控制栏是否显示,默认False表示隐藏
    actions_on_bottom = True  # 下方控制栏是否显示,默认False表示隐藏

    # 设置过滤器的字段条件[值只能是模型字段,不能是模型方法]
    list_filter = ["classmate", "sex"]  # 过滤器,按指定字段的不同值来进行展示

    # 允许直接点击列表页进入编辑的字段[值只能是模型字段,不能是模型方法]
    list_editable = ["age"]

    # 分页显示列表页数据[单页数据量]
    list_per_page = 5

    # 搜索框搜索字段条件[值只能是模型字段,不能是模型方法]
    search_fields = ["name", "classmate"]  # 搜索内容

    # 日期筛选功能[值只能是模型中的日期时间字段,不能是模型方法,也不能时其他格式字段]
    date_hierarchy = "created_time"

    """自定义方法字段"""
    def sex_text(self, obj):
        return "男" if obj.sex else "女"

    # 自定义字段列的文本描述
    sex_text.short_description = "性别"
    sex_text.admin_order_field = "sex"

    @admin.display(description="出生年份", ordering="age")
    def born(self, obj):
        from datetime import datetime
        return datetime.now().year - obj.age


admin.site.register(Student, StudentModelAdmin)

model.py文件

from django.db import models


# Create your models here.
class Student(models.Model):
    """学生信息"""
    name = models.CharField(max_length=255, verbose_name="姓名", help_text="姓名")
    sex = models.BooleanField(default=True, verbose_name="性别" ,help_text="性别")
    age = models.IntegerField(verbose_name="年龄", help_text="年龄")
    classmate = models.CharField(db_column="class", max_length=5, verbose_name="班级", help_text="班级编号为3个数字组成")
    description = models.TextField(max_length=1000, null=True, blank=True, verbose_name="个性签名", help_text="个性签名")
    created_time = models.DateTimeField(auto_now_add=True, null=True, blank=True, help_text="注册日期")

    class Meta:
        db_table = "tb_student"
        verbose_name = "学生信息"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name

    """自定义方法字段[如果在admin.py中设置了,就不要在这边编写了]"""
    # def sex_text(self):
    #     return "男" if self.sex else "女"
    #
    # # 自定义字段列的文本描述
    # sex_text.short_description = "性别"
    # sex_text.admin_order_field = "sex"
    #
    # def born(self):
    #     from datetime import datetime
    #     return datetime.now().year - self.age
    #
    # # 自定义字段列的文本描述
    # born.short_description = "出生年份"
    # born.admin_order_field = "age"

数据库和本地Django的时区有冲突,所以需要根据实际开发过程中的业务来考虑是否要修改时区关闭USE_TZ,settings.py,代码:

USE_TZ = False

详细页配置

from django.contrib import admin
from .models import Student

class StudentModelAdmin(admin.ModelAdmin):
    """列表页配置"""
    # 列表列显示的数据字段[值可以是模型的字段,也可以是模型的方法名(方法不能有参数)]
    list_display = ["id", "name", "classmate", "age", "sex", "sex_text", "born"]
    # 设置点击哪些字段可以跳转到详情页
    list_display_links = ["id"]

    # 默认排序[值只能是模型字段,不能是模型方法]
    ordering = ['-age','id']
    # 动作栏是否在上下方显示
    actions_on_top = True     # 上方控制栏是否显示,默认False表示隐藏
    actions_on_bottom = True  # 下方控制栏是否显示,默认False表示隐藏

    # 设置过滤器的字段条件[值只能是模型字段,不能是模型方法]
    list_filter = ["classmate", "sex"]  # 过滤器,按指定字段的不同值来进行展示

    # 允许直接点击列表页进入编辑的字段[值只能是模型字段,不能是模型方法]
    list_editable = ["age"]

    # 分页显示列表页数据[单页数据量]
    list_per_page = 5

    # 搜索框搜索字段条件[值只能是模型字段,不能是模型方法]
    search_fields = ["name", "classmate"]  # 搜索内容

    # 日期筛选功能[值只能是模型中的日期时间字段,不能是模型方法,也不能时其他格式字段]
    date_hierarchy = "created_time"

    # 自定义方法字段
    def sex_text(self, obj):
        return "男" if obj.sex else "女"

    # 自定义字段列的文本描述
    sex_text.short_description = "性别"
    sex_text.admin_order_field = "sex"

    @admin.display(description="出生年份", ordering="age")
    def born(self, obj):
        from datetime import datetime
        return datetime.now().year - obj.age


    """详情页配置"""
    # # 设置修改或添加页面的表单中显示的字段列表
    # fields = ['name', 'sex', 'age', 'classmate', "description"]

    # # 设置修改或添加页面的表单中不显示的字段列表
    # exclude = ["classmate"]

    # 字段分组展示,字段分组和上面的字段列表配置(fiedls或exclude)是互斥的。
    fieldsets = (
        ("必填项", {
            'fields': ('name', 'age', 'description')
        }),
        ('可选项', {
            'classes': ('collapse',),  # 折叠样式
            'fields': ('sex', 'classmate'),
        }),
    )

    # 添加数据的字段列配置
    add_fieldsets = (
        ("必填项", {
            'classes': ('wide',),
            'fields': ('name', 'age', 'classmate'),
        }),
        ('可选项', {
            'classes': ('collapse',),  # 折叠样式
            'fields': ('sex', 'description'),
        }),
    )


    # 识别当前操作是添加数据还是更新数据,方便加载不同的fieldsets配置
    def get_fieldsets(self, request, obj=None):
        """
        :request 本次客户端的请求处理对象
        :obj     本次客户端更新的模型对象[如果本次操作属于添加数据操作,则obj的值为None]
        """
        if obj:
            # 修改数据的操作
            return self.fieldsets
        # 添加数据的操作
        return self.add_fieldsets

    def save_model(self, request, obj, form, change):
        """
        当站点保存(添加、编辑)当前模型时自动执行的钩子方法
        区分:依靠ID来进行区分,obj是否有id
        :request 本次客户端的请求处理对象
        :obj     本次客户端操作的模型对象[如果本次操作属于添加数据操作,则obj的值为None]
        :form    本次客户端提交的表单信息
        :change  本次客户端更新数据后的表单信息
        """
        # 验证数据或者补充代码操作
        if obj.age > 100 or obj.age < 1:
            raise TypeError("年龄必须是正常人类的年龄!")

        if obj.id:
            print("更新模型操作")
        else:
            print("添加模型操作")

        return super().save_model(request, obj, form, change)  # 让当前模型继续保存数据,如果上面代码已经完成操作,这一句代码可以注释掉了。


    def delete_model(self, request, obj):
        """详情页删除操作"""
        print("详情页删除模型操作")
        return super().delete_model(request, obj)

    def delete_queryset(self, request, queryset):
        """列表页删除操作"""
        print("列表页删除模型操作")
        return super().delete_queryset(request, queryset)

admin.site.register(Student, StudentModelAdmin)

simpleui

django提供的admin站点已经非常强大了。但是定制性仅限于它提供的配置,要深度定制,只能自己开发。

一般可以借助ant design(antd)、element-plus 前端的UI框架。

然后,当然如果使用admin内置运营站点,也可以在admin基础上进行站点外观美化,或者功能的扩展。

一般站点美化模块: xadmin(django2.x)、simpleui(django3.0,增强版:simplepro)

simpleUI的官方站点:https://simpleui.72wo.com/

安装:

pip install django-simpleui

settings.py,注册simpleUI,代码:

INSTALLED_APPS = [
    'simpleui', # admin界面美化,必须写在admin上面
    'django.contrib.admin', # 内置的admin运营站点
    # ...
]

simpleUI的基本配置,settings.py,代码:

"""simpleUI的配置"""
SIMPLEUI_LOGIN_PARTICLES = False
SIMPLEUI_LOGO = 'https://avatars2.githubusercontent.com/u/13655483?s=60&v=4'
# SIMPLEUI_HOME_PAGE = 'https://www.163.com'
# SIMPLEUI_HOME_TITLE = '百度一下你就知道'
​
from django.contrib.admin import AdminSite
​
AdminSite.site_header = "标题名"
AdminSite.site_title = ""

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值