模拟admin组件自己开发stark组件之创建篇
admin组件
admin组件为我们提供了针对django管理页面
我们先简短来看下django的admin组件的启动流程,注册流程,url匹配过程
启动注册
1. 扫描所有应用下的注册了应用中的admin.py文件(启动,即扫描)
from django.contrib.admin.sites import site
from django.utils.module_loading import autodiscover_modules
def autodiscover():
autodiscover_modules('admin', register_to=site)
2. admin.site,这个文件是通过模块的导入然后调用类方法实现,并不是admin提供的方法(注册)
sites.py文件
site = AdminSite()
AdminSite类,包含了admin的全局配置
注意###
在admin.py里面,只有一个site对象,单例模式,以后的admin的应用都要基于 admin.site对象,也就是register也都是一个对象方法,
admin.site.register(book1)
admin.site.register(book2)
admin.site.register(book3) admin.site都是一个实例
3. admin.site.register,注册了model对象,样式类对象
2个参数,第一个models,第二个可以不传,默认为空,样式类
def register(self, model_or_iterable, admin_class=None, **options):
if not admin_class:
admin_class = ModelAdmin
如果是None就会走默认的ModelAdmin样式 如果不是None在admin里面继承了ModelAdmin样式,还在它的样式上有了自己的修改,也就是我们在admin.py里面自己的样式类 有段源码,最后的名字就是 model_or_iterable = model self._registry[model] = admin_class(model, self) 执行了就是在给类属性,添加键值对
booke:(book配合Modeladmin是实例出来的对)象】 如果再有注册,就是往后面追加键值对。model为键,样式为值
URL配置
urlpatterns = [
url(r'^admin/', admin.site.urls),
]
1. admin.site,还是上面的实例,也就是说所有的amdin.site都是一个实例,我们来看看里面的方法
@property
def urls(self):
return self.get_urls(), 'admin', self.name # 第一个参数是url列表,第二个是应用名称,第三个是命名空间
def get_urls(self):
urlpatterns = [
url(r'^$', wrap(self.index), name='index'),]
return urlpatterns
最终会返回一个([url(),url(),url()],admin,self.name)这样的元祖
2. 我们会这样想,一个项目下的一个应用下的一个表的增删改查,在这之前,我们先要拼接上app01/stark/book/(add,del,edit),我们来演演变过程
urls演变过程
url(r'^joker/', joker.site.urls),
# @property
# def urls(self):
# return self.get_urls(), 'stark', None
#self.get_urls() == admin.site.get_urls()
url(r'^joker/', ([url('','')], 'stark', None)),
我们希望可以拼接应用名称,表名称
def get_urls(self):
urlpatterns = []
for model, joker_admin in self._registry.items(): # 注册了就会得到2个对象,一个MODELS对象,一个样式类对象
model_name = model._meta.model_name # 应用名称
app_label = model._meta.app_label # 表名
# UR()方法,里面第一个参数是正则,第二个是可调用对象,或者列表,元祖。
# 如果是列表,元祖的话,
c_url = url('^{0}/{1}/'.format(app_label,model_name),增删改查) ## JOKER/APP01/BOOK, 分发
# [url("^$",self.change_list),
# url("^add/$",self.add),
# url("^\d+/change/$",self.change),
# url("^\d+/delete/$",self.delete),],NONE,NONE urlpatterns.append(c_url)
return urlpatterns @property
def urls(self): # 模拟了ADMIN的URLS方法,看返回的是什么(【】,NONE, NONE)
return self.get_urls(), None, None
我们希望增删改查是每一个表都有的,我们将这个加入到默认样式类中,这个就很简单了,下面奉上创建stark的过程和代码
stark创建
1. 创建stark目录,里面在创建server目录,里面创建stark.py文件,作为我们的服务目录
问题来了,谁来加载我们自己创建的目录呢,我们可以在stark应用下的apps.py中
from django.apps import AppConfig from django.contrib.admin.sites import site
from django.utils.module_loading import autodiscover_modules class starkConfig(AppConfig):
name = 'stark'
# 启动发现
def ready(self): 该类是默认就存在的,我们在下面加入准备方法,扫描所有应用下的stark.py文件
autodiscover_modules('stark', register_to=site)
2. 开始注册,在stark.py中写入
# print("app01 stark....") # 启动时候就会打印 from stark.server import stark
from .models import * stark.site.register(Book) 加载执行
stark.site.register(Publish)
3. 服务端的stark.py的配置,注意里面的url方法
from django.conf.urls import url
from django.shortcuts import HttpResponse # 首先是启动问题 settingS 注册,apps可以查询到 class ModelAdmin(object): # 默认样式
def __init__(self,model,site):
self.model = model
self.site = site def get_urls(self): # 默认的增删改查 temp=[
url("^$",self.change_list),
url("^add/$",self.add),
url("^\d+/change/$",self.change),
url("^\d+/delete/$",self.delete),
] return temp @property # 获取URL
def urls(self):
return self.get_urls(), None, None # URL 就是 三个参数,(【】,,) def change_list(self,request):
return HttpResponse("change_list") def delete(self,request):
return HttpResponse("delete") def change(self,request):
return HttpResponse("change") def add(self,request):
return HttpResponse("add") class Jokersite(object): # 针对JOKER的全局配置
def __init__(self):
self._registry = {}
def register(self, model, joker_class=None):
if not joker_class:
joker_class = ModelAdmin
self._registry[model] = joker_class(model, self) # 添加类对象,MODEL对象:样式类对象
print(self._registry) def get_urls(self): urlpatterns = []
for model, joker_admin in self._registry.items(): # 注册了就会得到2个对象,一个MODELS对象,一个样式类对象
model_name = model._meta.model_name # 应用名称
app_label = model._meta.app_label # 表名
# UR()方法,里面第一个参数是正则,第二个是可调用对象,或者列表,元祖。
# 如果是列表,元祖的话,
c_url = url('^{0}/{1}/'.format(app_label,model_name),joker_admin.urls) ## stark/APP01/BOOK, 分发
# [url("^$",self.change_list),
# url("^add/$",self.add),
# url("^\d+/change/$",self.change),
# url("^\d+/delete/$",self.delete),],NONE,NONE urlpatterns.append(c_url)
return urlpatterns @property
def urls(self): # 模拟了ADMIN的URLS方法,看返回的是什么(【】,NONE, NONE)
return self.get_urls(), None, None site=Jokersite() # 实例自己写的类
模拟admin组件自己开发stark组件之创建篇的更多相关文章
- 模拟admin组件自己开发stark组件之自定义list_display,反向解析url
反向解析 在上一篇文章中,我们创建好了stark这个组件,一个应用一个表有四个默认的url,那么我们如何区别这些url,因为可能会有重复现象(本组件不会,因为前面拼接了应用名,表明,肯定唯一),概念请 ...
- 模拟admin组件自己开发stark组件之搜索和批量操作
搜索相关,搜索的本质就是从数据库查询出来的数据过滤 用户自定义给出过滤条件joker.py list_display = ('id','title','price',) show_add_btn = ...
- 模拟admin组件自己开发stark组件之增删改查
增删改查,针对视图 我们需要modelform来创建,可自动生成标签,我们还要考虑用户是不是自己定制,依然解决方法是,继承和重写 app01下的joker.py文件 class BookModelFo ...
- 在WePY中实现了小程序的组件化开发,组件的所有业务与功能在组件本身实现,组件与组件之间彼此隔离,上述例子在WePY的组件化开发过程中,A组件只会影响到A所绑定的myclick
wepyjs - 小程序组件化开发框架 https://tencent.github.io/wepy/document.html#/?id=%e5%be%ae%e4%bf%a1%e5%b0%8f%e7 ...
- 10.18正式开发stark组件*(三)
2018-10-18 19:15:54 等这个stark组件做完了再上传到github上面,然后再整理博客!这就到周末啦! 因为models导入的时候出现bug,所以只有源码没有测试数据! 源码都有注 ...
- Agile.Net 组件式开发平台 - 组件开发示例
所谓组件式开发平台,它所有的功能模块都是以组件的形式扩展的,下面我来演示一个简单的组件开发例程. Agile.Net开发管理平台项目,已经托管在开源中国码云平台(http://git.oschina. ...
- 10.15仿admin开发stark组件(一)
2018-10-15 12:28:50 越努力,越幸运!永远不要高估自己! 低调做人,高调做事! 明天开stark项目!! admin 参考连接: http://www.cnblogs.com/yua ...
- 10.16 正式开发stark组件(一)
2018-10-16 17:26:44 Django MTV 路由配置里面有 反向解析 参考连接:https://www.cnblogs.com/yuanchenqi/articles/762993 ...
- django 之 stark组件
----------------------------------------------------------------烦恼没完没了,内心动荡不安,呜呼哀哉. 一.有个特殊的需求,需要用sta ...
随机推荐
- Volatility2.4以上版本及fmem使用指南
因为要做一个取证项目,需要用到volatility这款软件,网上很多教程已经是很多年以前的东西了,导致很多人在制作profile这一步就卡住了,今天解决了这个问题,记录在此,分享给大家共同学习 1.安 ...
- .net的session详解
http://blog.csdn.net/justin_wkf/article/details/5746914#comments
- c++下使用命名管道实现进程间通信
前面已经使用邮槽实现过进程间通信:http://www.cnblogs.com/jzincnblogs/p/5192654.html ,这里使用命名管道实现进程间通信. 与邮槽不同的是,命名管道在进程 ...
- Graham扫描法
Graham扫描法求凸包的模板 运行之后可以得到存有凸包顶点的栈s和栈顶指针top,n代表总点数 这个模板我当时调了很久,主要难点有两个,一个是正确的极角排序,一个是出栈入栈的细节操作,逆时针扫描,这 ...
- python爬虫入门(5)-Scrapy概述
http://scrapy-chs.readthedocs.io/zh_CN/latest/intro/overview.html Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框 ...
- UNIX环境高级编程 标准IO库
标准I/O库处理很多细节,使得便于用户使用. 流和 FILE 对象 对于标准I/O库,操作是围绕 流(stream)进行的.当用标准I/O打开或创建一个文件时,我们已使一个流与一个文件相关联. 对于A ...
- linux下导入、导出mysql 数据库命令
一.导出数据库用mysqldump命令(注意mysql的安装路径,即此命令的路径):1.导出数据和表结构:mysqldump -u用户名 -p密码 数据库名 > 数据库名.sql#/usr/lo ...
- BZOJ2154 Crash的数字表格 【莫比乌斯反演】
BZOJ2154 Crash的数字表格 Description 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b) ...
- Visual->UIElement->FrameworkElement,带来更多功能的同时也带来了更多的限制
在 WPF 或 UWP 中,我们平时开发所遇到的那些 UI 控件或组件,都直接或间接继承自 Framework.例如:Grid.StackPanel.Canvas.Border.Image.Butto ...
- 携程框架Apollo实现.NET Core微服务统一配置(测试环境-单机)
Apollo实现.NET Core微服务统一配置(测试环境-单机) https://www.cnblogs.com/guolianyu/p/10065999.html 一.前言 注:此篇只是为测试环境 ...