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. day63-webservice 02.cxf环境搭建

    指定bin目录的目的是在docs窗口可以直接来执行这里面的命令. ANT这里面

  2. vim 的移动

    越来也喜欢用linux的vim 来编程了,简单.高效.专业,最近拿着一本<vim的中文使用手册>在慢慢的看,看到现在就没有勇气继续看下去,我想先放一下,运用前面自己学的东西实际的去操作一下 ...

  3. java 从jsp页面传集合给controller

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...

  4. Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.38/images/json: dial unix /var/run/docker.sock: conne

    使用docker报如下错误信息: Got permission denied while trying to connect to the Docker daemon socket at unix:/ ...

  5. Installing XGBoost on Mac OSX

      0. Get gcc with open mp.  Just paste and execute the following command in your terminal, once Home ...

  6. ifcfg-eth0文件参数PREFIX 和 NETMASK的配置不一致问题

    ifcfg-eth0文件参数PREFIX 和 NETMASK的配置不一致问题 摘自:https://blog.csdn.net/aikui0621/article/details/9148997 阅读 ...

  7. WordPaster2-正式包布署说明

    1.1. 多平台布署说明 提供信息如下: 1.多平台控件包(根据购买版本提供) 2.控件信息 3.配置方法   WordPaster(x86)Clsid信息 ClsidParser F4B7C0FD- ...

  8. 编写高质量代码改善C#程序的157个建议——建议35:使用default为泛型类型变量指定初始值

    建议35:使用default为泛型类型变量指定初始值 有些算法,比如泛型集合List<T>的Find算法,所查找的对象可能会是值类型,也有可能是引用类型.在这种算法内部,我们常常会为这些值 ...

  9. Func和Action的介绍及其用法

    Func是一种委托,这是在3.5里面新增的,2.0里面我们使用委托是用Delegate,Func位于System.Core命名空间下,使用委托可以提升效率,例如在反射中使用就可以弥补反射所损失的性能. ...

  10. C#Async,await异步简单介绍

    C# 5.0 引入了async/await,.net framework4.5开始支持该用法 使用: 由async标识的方法必须带有await,如果不带await,方法将被同步执行 static vo ...