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. mysql 主键

    什么是主键 表中的每一行都应该具有可以唯一标识自己的一列(或一组列).而这个承担标识作用的列称为主键. 任何列都可以作为主键,只要它满足以下条件: • 任何两行都不具有相同的主键值.就是说这列的值都是 ...

  2. 1-在eclipse里面配置python(最详细)

    最近有时间打算学下python,打算学当然是得先搞好开发工具,网上搜一波,发现许多ide,居然可以在eclipse下写python,由于最近一直在搞java,所以已经装了eclipse,所以打算就在e ...

  3. 第十课,ROS仿真2

    Rviz 属性 1.下面以turtlebot_stage inRviz为例 首先安装 sudo apt-get install ros-indigo-turtlebot-simulator 运行 ro ...

  4. js-简单的作业

    作业 1 将课堂 偶数奇数和 猜数字游戏 电话银行转for循环 2 编写 “个人所得税计算器”函数 10000 计算个税的方法: 3500 以下免征 6500 3500 ~ 5000 部分 缴纳 3% ...

  5. LightOJ 1038 Race to 1 Again (概率DP,记忆化搜索)

    题意:给定一个数 n,然后每次除以他的一个因数,如果除到1则结束,问期望是多少. 析:概率DP,可以用记忆公搜索来做,dp[i] = 1/m*sum(dp[j] + 1) + 1/m * (dp[i] ...

  6. Java集合类总结 (五)

    集合框架 为了避免进行不必要的随机访问操作,Java引入了一种标签接口RandomAccess, 这个接口没有任何方法,只是一个标签,用来标记一个集合是否应该进行随机访问操作: if (c insta ...

  7. C#NPOI.RabbitMQ.EF.Attribute.HttpRuntime.Cache.AD域.List<T>根据指定字段去重.前端JQuery.Cache.I18N(多语言).data-xx(自定义属性)

    使用NPOI 操作Excel 个人使用的电脑基本默认安装Excel 操作起来 调用Excel的组件便可.如果是一台服务器.没有安装Excel,也就无法调用Excel组件. 在此推荐第三方插件.NPOI ...

  8. c++内存模型------计算机系统核心概念及软硬件实现

    c++编程语言有3中不同类项的变量:全局变量.局部变量和动态分配变量.变量的值存储在计算机的内存中,但是变量存储的方式取决于变量的类项.3种类型的变量分别对应存储器中3个特定的区域: 全局变量存放在存 ...

  9. Thread Group(线程组)

    线程组,可以理解用户池,用来产生线程(用户),每一个线程代表一个用户,在使用JMeter进行性能测试过程中,经常需要模拟多个用户进行测试,可以通过设置线程数代表多少个用户,通常一个线程组就代表一个测试 ...

  10. 20165219 2017-2018-2 《Java程序设计》第4周学习总结

    20165219 2017-2018-2 <Java程序设计>第4周学习总结 课本知识总结 第五章 在java中,继承时使用extends关键字,private成员也会被继承,只不过子类无 ...