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

Django - Xadmin 组件(一)的更多相关文章

  1. Django - Xadmin 组件(二)

    Django 自带的 admin 组件可以自定义配置,本文实现 Xadmin 对自定义显示数据列 (list_display) 的配置. 构建表单数据 模板层 从视图函数传来的数据变量是双层列表,第一 ...

  2. Django admin组件源码流程

    admin 组件 Django 自带的用户后台组件 用于用户便携的操作 admin 组件核心 启动 注册 设计url 启动核心代码 每个app 通过 apps.py 扫描 admin.py 文件 并执 ...

  3. xadmin 组件拓展自定义使用

    xadmin 组件相关可选自定义字段 list_display 功能 设置默认的显示字段(列) 配置 list_display = ['name', 'desc', 'detail', 'degree ...

  4. Django - Xadmin (五) POP

    Django - Xadmin (五) POP 功能及逻辑描述 pop 功能:在添加数据时,对于需要选择的多对多字段,在其 input 框边加上一个按钮,点击该按钮可以实现跳转到添加该字段数据的页面: ...

  5. Django - Xadmin (四) Filter

    Django - Xadmin (四) Filter Filter 功能描述 与 admin 组件中 Filter 功能类似,在展示页面右侧放置一列标签,通过点击这些标签来筛选出该标签相关的数据. 比 ...

  6. Django+xadmin打造在线教育平台(二)

    三.xadmin后台管理 3.1.xadmin的安装 django2.0的安装(源码安装方式): https://github.com/sshwsfc/xadmin/tree/django2 把zip ...

  7. Django+xadmin打造在线教育平台(三)

    五.完成注册.找回密码和激活验证码功能 5.1.用户注册 register.html拷贝到templates目录 (1)users/views.py class RegisterView(View): ...

  8. django Form组件

    django Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建 ...

  9. Django+xadmin打造在线教育平台(一)

    目录 在线教育平台(一)      在线教育平台(二) 在线教育平台(三)      在线教育平台(四) 在线教育平台(五)      在线教育平台(六) 在线教育平台(七)      在线教育平台( ...

随机推荐

  1. 使用Apache IO库操作IO与文件

    --------------siwuxie095                         首先到 Apache官网 下载相关的库文件     Apache官网:http://www.apach ...

  2. BeanUtils简单应用

    <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http:// ...

  3. 面试题:J2EE中web.xml配置文件详解 背1

    一.web.xml是什么 web.xml学名叫部署描述符文件,是在Servlet规范中定义的,是Web应用的配置文件,是Web应用的基础. 二.web.xml加载流程 总的来说:ServletCont ...

  4. 23、sed常用命令

    1.匹配与不匹配: n p ! sed -n '/ATTGC/p' file1                ##-n打印匹配到的行输出,默认所有行输出. sed -n '/AT\|GC/p' fil ...

  5. Luogu 4844 LJJ爱数数

    LOJ 6482 设$d = gcd(a, b)$,$xd = a$,$yd = b$,因为$\frac{1}{a} + \frac{1}{b} = \frac{a + b}{ab} = \frac{ ...

  6. Luogu 3066 [USACO12DEC]逃跑的BarnRunning Away From…

    好像是某CF的题,不记得…… 很套路的题,但是觉得可以做一下笔记. 倍增 + 差分. 有一个比较简单的思路就是每一个点$x$向上走一走,直到走到一个点$y$使总路程恰好不超过超过了$L$,然后把$(x ...

  7. SpringMVC——映射请求参数

    Spring MVC 通过分析处理方法的签名,将 HTTP 请求信息绑定到处理方法的相应人参中. @PathVariable @RequestParam @RequestHeader 等) Sprin ...

  8. javascript鼠标双击时触发事件大全

    javascript事件列表解说 事件 浏览器支持 解说 一般事件 onclick IE3.N2 鼠标点击时触发此事件 ondblclick IE4.N4 鼠标双击时触发此事件 onmousedown ...

  9. Sql Server 公用表达式(CTE)

    简介 对于select查询语句来说,通常情况下,为了使T-SQL代码更加简洁和可续,在一个查询中引入另外的结果集都是通过视图而不是子查询来进行分解的,但是,视图是作为系统对象存在数据库中,那对于结果集 ...

  10. bitest(位集合)------c++程序设计原理与实践(进阶篇)

    标准库模板类bitset是在<bitset>中定义的,它用于描述和处理二进制位集合.每个bitset的大小是固定的,在创建时指定: bitset<4> flags; bitse ...