模拟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 = modelself._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,NONEurlpatterns.append(c_url)return urlpatterns@propertydef 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 AppConfigfrom django.contrib.admin.sites import site from django.utils.module_loading import autodiscover_modulesclass 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 = modelself.site = sitedef 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 # 获取URLdef 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 = ModelAdminself._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,NONEurlpatterns.append(c_url)return urlpatterns@propertydef urls(self): # 模拟了ADMIN的URLS方法,看返回的是什么(【】,NONE, NONE)return self.get_urls(), None, Nonesite=Jokersite() # 实例自己写的类
转载于:https://www.cnblogs.com/jokerbj/p/8385489.html
模拟admin组件自己开发stark组件之创建篇相关推荐
- android 界面组件,安卓开发学习周第三篇——Android中的UI组件
原标题:安卓开发学习周第三篇--Android中的UI组件 在Android APP中,所有的用户界面元素都是由View和ViewGroup的对象构成的.View是绘制在屏幕上的用户能与之交互的一个对 ...
- android 组件化_你曾遇到的某大厂奇葩问题:Android组件化开发,组件间的Activity页面跳转...
组件化开发有什么好处? 1.当项目越来越大时,app的业务越来越复杂,会出现业务功能复杂混乱,各功能块.页面相互依赖,相互调用太多导致耦合度高,而采用组件化开发,我们就可以将功能模块合理的划分,降低功 ...
- python 全栈开发,Day112(内容回顾,单例模式,路由系统,stark组件)
python 全栈开发,Day112(内容回顾,单例模式,路由系统,stark组件) 一.内容回顾 类可否作为字典的key 初级 举例: class Foo(object):pass_registry ...
- Android之组件化开发
转载请标明出处:[顾林海的博客] 个人开发的微信小程序,目前功能是书籍推荐,后续会完善一些新功能,希望大家多多支持! ##前言 在以前的项目中都是建一个基础库,项目依赖基础库,主项目中集成了所有的功能 ...
- 架构:Android 组件化开发
前言 强烈推荐先阅读这篇文章 Android 组件化最佳实践 本文是阅读实践后的思考总结,更倾向实践步骤. 组件化开发架构 组件化开发大体就是这样的架构,最关键的是base 和 base_custom ...
- 疯狂连连看之开发游戏界面组件一
疯狂连连看之开发游戏界面组件一 开发游戏界面组件 本游戏的界面组件采用了一个自定义View:GameView,它从View基类派生而出,这个自定义View的功能就是根据游戏状态来绘制游戏界面上的全部方 ...
- 微信小程序自定义组件开发即组件间通信详解
自定义组件开发 1.我的工程目录 pages components 自定义组件 2.定义一个组件名称为toast(目录下文件与页面开发一样.js .wxml .wxss .json文件) 在自定义组件 ...
- Vue.js教程-组件化开发
Vue.js教程-组件化开发 前言 Vue组件化 什么是组件化 Vue单页面开发的解释 组件化思想 组件的使用 原理 实际开发中的使用-父子组件 父子组件传递数据 父传子-props用法 子传父-th ...
- 从 0 到 1 上手 Web Components 业务组件库开发
组件化是前端发展的一个重要方向,它一方面提高开发效率,另一方面降低维护成本.主流的 Vue.js.React 及其延伸的 Ant Design.uniapp.Taro 等都是组件框架. Web C ...
最新文章
- linux关机正确方法
- [wp7游戏]wp7~~飞行射击精品游戏~~集合贴
- Centos7修改Docker默认存储位置
- qgridlayout 滚动时固定第一行_滚动直线导轨副的安装技术
- mongodb 入门 启动mongodb 无法启动 问题 非正常关闭
- Redis 服务安装
- 解决Latex报错latex Unknown float option `H‘.
- MYSQL5.7---ONLY_FULL_GROUP_BY 异常处理
- shell(九)几个字符转换命令
- 利用双向注意流进行机器理解
- linux openssh升级8.1,ssh服务升级8.1
- win10访问不了win7文件服务器,win10和win7共享文件教程 win10和win7共享文件无法访问...
- 【转帖】mysql锁机制
- RabbitMQ-启动各种报错,windows环境,RabbitMQPlugin configuration unchanged
- 谷歌中国推出10款有趣的小工具
- 【非原创】Ubuntu14.04+cuda6.5+opencv2.4.9+caffe配置记录
- 华为5g cpe 虚拟服务器,中国移动科普5G CPE:不换手机也能体验5G
- 从运维角度聊下:如何维护一套 DevOps 系统
- php wenjian shangchuan shijian,PHP时间和日期 - osc_nnp3dgfb的个人空间 - OSCHINA - 中文开源技术交流社区...
- 年产2万吨山楂酒工厂的设计-装瓶工段及车间的设计(lunwen+任务书+开题+选题表+cad图纸)
热门文章
- 史上最大规模机器人“面相”调查:157张脸背后的人类感受
- 亚洲首个无人船试验基地建于中国珠海,无人船或将助力南海巡逻
- 苹果自动驾驶测试车近距离实拍,头顶新添传感器和硬件
- 《脱颖而出——成功网店经营之道》一2.5 后方——不可忽视的金库
- 玩转Excel系列-SUMIF函数实例教程
- Cent OS 重置root密码
- win8.1远程桌面连接2008显示正在加密远程连接
- SQL server 2008 中的五个系统数据库详解
- POJ-1328 Radar Installation 贪心
- Ajax不起作用....