• Django


    Django - Xadmin 组件(一)

    Web 应用中离不开的就是后台管理, Django 自带的 admin 组件提供了一部分内容,但往往现实项目中会有更多的需求,所以自定义自己的后台管理就十分重要了,此处所谓的 Xadmin 组件就是自定义后台。

    Xadmin 组件注册

    创建 Xadmin 组件

    首先,和创建 app01 类似,创建一个名为 Xadmin 的 APP 。并在 settings.py 文件中加入该组件的配置信息。

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'Xadmin.apps.XadminConfig',
        'app01.apps.App01Config',
        'app02.apps.App02Config',
    ]
    

    修改 Xadmin 组件的配置类

    在 Xadmin 组件中的 app.py 文件中更改 XadminConfig 类,主要是增加一个 ready 函数,使得在项目运行时就自动执行每个 APP 下面的 Xadmin 文件。

    # Xadmin/app.py
    
    from django.apps import AppConfig
    from django.utils.module_loading import autodiscover_modules
    
    
    # 组件Xadmin的配置类,在项目启动时进行加载
    class XadminConfig(AppConfig):
        name = 'Xadmin'
    
        # 加载该类时自动执行ready函数
        def ready(self):
            # 扫描所有Xadmin的模块,启动完成后执行每个APP下的Xadmin文件
            autodiscover_modules('Xadmin')
    
    

    注意,刚开始创建的 APP 中并没有 Xadmin 文件,而是有 admin.py 文件,这是 Django 自带的,创建一个 Xadmin.py 文件来代替 admin.py ,之后会在这个文件中进行对数据 model 的注册。

    目录结构

    创建相关类和方法

    创建类的文件

    在 Xadmin 组件文件中创建一个 service 的包,在其中创建一个 Xadmin.py 文件,作为 Xadmin 类的文件。如上图目录结构所示。

    XadminSite 类

    XadminSite 类就是 Xadmin 组件的类。

    XadminSite 类需要两个函数,一个是 init 函数用来初始化注册过的字典,另一个是 register 函数用来对数据 model 进行注册。

    # Xadmin/service/Xadmin.py
    
    class XadminSite(object):
        def __init__(self):
            self._registry = {}
    
        def register(self, model, admin_class=None, **options):
            if not admin_class:
                admin_class = ModelXadmin
    
            self._registry[model] = admin_class(model, self)
    

    ModelXadmin 类

    ModelXadmin 类就是 Xadmin 每个数据 model 的配置类的父类,一些自定义内容都是在该类中进行实现的。

    该类主要传入的是 model 类对象和 Xadmin 类的实例对象。

    # Xadmin/service/Xadmin.py
    
    class ModelXadmin(object):
        def __init__(self, model, site):
            self.model = model
            self.site = site
    

    单例对象 site

    为了在整个项目运行过程中使用同一个 Xadmin 的实例对象,需要通过模块方式对 XadminSite 实现单例对象。

    关于单例对象的内容请参考:单例模式

    # Xadmin/service/Xadmin.py
    
    site = XadminSite()
    

    Xadmin 组件 url 设计

    Xadmin 中 url 的设计思路与 admin 中的其实是相同的,请参考Django 中 admin 的执行流程中的 url 配置。

    urls.py 文件中的配置

    在 urls.py 文件中,我们像 admin 组件一样配置 url 。

    from django.conf.urls import url
    from django.contrib import admin
    from Xadmin.service.Xadmin import site
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^Xadmin/', site.urls),
    ]
    

    第一层 url

    与 admin 组件类似,通过 XadminSite 的静态方法 urls 来配置 url 。

    class XadminSite(object):
        def __init__(self):
            self._registry = {}
    
        def get_urls(self):
            temp = []
    
            for model, admin_class_obj in self._registry.items():
                app_name = model._meta.app_label
                mode_name = model._meta.model_name
    
                temp.append(url(r'^{}/{}/'.format(app_name, mode_name), admin_class_obj.urls2))
            return temp
    
        @property
        def urls(self):
            return self.get_urls(), None, None
    
        def register(self, model, admin_class=None, **options):
            if not admin_class:
                admin_class = ModelXadmin
    
            self._registry[model] = admin_class(model, self)
    
    

    注意,函数 urls 返回的是个元组,元组的第一个元素是个列表,该列表由函数 get_urls 返回,列表存储的是 url 。而在 get_urls 函数返回的链接列表中是 ModelXadmin 示例对象调用的函数。这就是第二层 url 。

    第二层 url

    第二层 url 的意义在于对不同数据 model 做不同操作时是不同的链接。

    而第二层 url 由 ModelXadmin 调用是因为在该配置类中可以定义不同的需求。

    class ModelXadmin(object):
        def __init__(self, model, site):
            self.model = model
            self.site = site
    
        def get_urls2(self):
            temp = []
    
            temp.append(url(r'^$', self.list_view))
            temp.append(url(r'^add/$', self.add_view))
            temp.append(url(r'^(d+)/change/$', self.change_view))
            temp.append(url(r'^(d+)/delete/$', self.delete_view))
    
            return temp
    
        @property
        def urls2(self):
            return self.get_urls2(), None, None
    

    GitHub 地址:https://github.com/protea-ban/oldboy/tree/master/s9day83/Xadmindemo

  • 相关阅读:
    KT_登录_流程图
    从零开始——电子商务平台02_遇到的小问题
    从零开始——电子商务平台02
    COCOMOII
    从零开始——电子商务平台01_遇到的小问题
    从零开始——电子商务平台01
    从零开始——MySql01
    【 bzoj4537】HNOI2016 最小公倍数
    SDOI2016 R1 解题报告 bzoj4513~bzoj4518
    左偏树初步 bzoj2809 & bzoj4003
  • 原文地址:https://www.cnblogs.com/banshaohuan/p/9843157.html
Copyright © 2020-2023  润新知