博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django - Xadmin 组件(一)
阅读量:4982 次
发布时间:2019-06-12

本文共 3724 字,大约阅读时间需要 12 分钟。

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.pyfrom django.apps import AppConfigfrom 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.pyclass 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.pyclass ModelXadmin(object):    def __init__(self, model, site):        self.model = model        self.site = site

单例对象 site

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

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

# Xadmin/service/Xadmin.pysite = XadminSite()

Xadmin 组件 url 设计

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

urls.py 文件中的配置

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

from django.conf.urls import urlfrom django.contrib import adminfrom Xadmin.service.Xadmin import siteurlpatterns = [    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

701977-20190501094902261-873549745.png

转载于:https://www.cnblogs.com/banshaohuan/p/9843157.html

你可能感兴趣的文章
工具选择
查看>>
(转)C#实现RSA非对称加密解密
查看>>
迅为iTOP-4412开发板-Android4.4-固定MAC
查看>>
centos下,安装MySQL以及配置远程连接等
查看>>
获取硬盘和CPU的序列号
查看>>
Python全栈开发 day2 - 数据类型详解
查看>>
葡萄城报表的数据可视化分析
查看>>
(转)面向对象的三大基石(封装,继承和复合,多态)
查看>>
jquery $.ajax $.get $.post的区别?
查看>>
python中运行pip出现Fatal error in launcher错误
查看>>
2017北京国庆刷题Day7 afternoon
查看>>
bzoj千题计划108:bzoj1018: [SHOI2008]堵塞的交通traffic
查看>>
C++集成设计环境——Code::Blocks安装过程
查看>>
Maven小记
查看>>
一定不要在头文件中using namespace XXX
查看>>
运行百度语音识别官方iOS demo报错: load offline engine failed: 4001
查看>>
THREE.OrbitControls参数控制
查看>>
iOS开发--XMPPFramework--好友列表(五)
查看>>
非对称加密与证书(上篇)
查看>>
面向对象基础
查看>>