Django - Xadmin 组件(一)
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 组件(一)的更多相关文章
- Django - Xadmin 组件(二)
Django 自带的 admin 组件可以自定义配置,本文实现 Xadmin 对自定义显示数据列 (list_display) 的配置. 构建表单数据 模板层 从视图函数传来的数据变量是双层列表,第一 ...
- Django admin组件源码流程
admin 组件 Django 自带的用户后台组件 用于用户便携的操作 admin 组件核心 启动 注册 设计url 启动核心代码 每个app 通过 apps.py 扫描 admin.py 文件 并执 ...
- xadmin 组件拓展自定义使用
xadmin 组件相关可选自定义字段 list_display 功能 设置默认的显示字段(列) 配置 list_display = ['name', 'desc', 'detail', 'degree ...
- Django - Xadmin (五) POP
Django - Xadmin (五) POP 功能及逻辑描述 pop 功能:在添加数据时,对于需要选择的多对多字段,在其 input 框边加上一个按钮,点击该按钮可以实现跳转到添加该字段数据的页面: ...
- Django - Xadmin (四) Filter
Django - Xadmin (四) Filter Filter 功能描述 与 admin 组件中 Filter 功能类似,在展示页面右侧放置一列标签,通过点击这些标签来筛选出该标签相关的数据. 比 ...
- Django+xadmin打造在线教育平台(二)
三.xadmin后台管理 3.1.xadmin的安装 django2.0的安装(源码安装方式): https://github.com/sshwsfc/xadmin/tree/django2 把zip ...
- Django+xadmin打造在线教育平台(三)
五.完成注册.找回密码和激活验证码功能 5.1.用户注册 register.html拷贝到templates目录 (1)users/views.py class RegisterView(View): ...
- django Form组件
django Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建 ...
- Django+xadmin打造在线教育平台(一)
目录 在线教育平台(一) 在线教育平台(二) 在线教育平台(三) 在线教育平台(四) 在线教育平台(五) 在线教育平台(六) 在线教育平台(七) 在线教育平台( ...
随机推荐
- c++策略模式(Strategy Method)
别人的博客再讲策略模式时都会讲三国,策略类就是赵云的锦囊,锦囊里装着若干妙计.在打仗时想要用什么妙计,直接从锦囊里去取. 锦囊类: class context { public: context(IS ...
- linq 条件查询与分页
<div>姓名:<asp:TextBox ID="T1" runat="server"></asp:TextBox>< ...
- struts2 框架的基本使用
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http:// ...
- Vue.js 安装及其环境搭建
For me or other first studying vue.js. For Windows PC: 1.先安装node.js 安装官网最新的即可 版本应该要大于6.0版本 nodejs的官网 ...
- Browser
浏览器中关于事件的那点事儿 作者: 顽Shi 发布时间: 2014-02-01 20:22 阅读: 7830 次 推荐: 25 原文链接 [收藏] 摘要:事件在Web前端领域有很重要 ...
- spring.net 集成nhibernate配置文件(这里暴露了GetCurrentSession 对于 CurrentSession unbond thread这里给出了解决方法)
我这里主要分成了两个xml来进行spring.net管理实际情况中可自己根据需要进行分类 Dao2.xml <?xml version="1.0" encoding=&quo ...
- logback 中文手册
摘自:http://aub.iteye.com/blog/1896611 logback 中文手册 博客分类: Log loglogbackloback手册loback中文手册 logback 常 ...
- 当鼠标悬停在链接上,或者点击过的链接,颜色会被设置为 #2a6496。同时,会呈现一条下划线。点击过的链接,会呈现一个颜色码为 #333 的细的虚线轮廓。另一条规则是设置轮廓为 5 像素宽,且对于基于 webkit 浏览器有一个 -webkit-focus-ring-color 的浏览器扩展。轮廓偏移设置为 -2 像素
a:hover, a:focus { color: #2a6496; text-decoration: underline; } a:focus { outline: thin dotted #333 ...
- WCF把书读薄(4)——事务编程与可靠会话
WCF把书读薄(3)——数据契约.消息契约与错误契约 真不愧是老A的书,例子多,而且也讲了不少原理方面的内容,不过越读越觉得压力山大……这次来稍微整理整理事务和可靠会话的内容. 十八.事务编程 WCF ...
- 很棒的git和python学习网站
很棒的git和python学习网站:http://www.liaoxuefeng.com/ 博主名叫廖雪峰