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组件之创建篇相关推荐

  1. android 界面组件,安卓开发学习周第三篇——Android中的UI组件

    原标题:安卓开发学习周第三篇--Android中的UI组件 在Android APP中,所有的用户界面元素都是由View和ViewGroup的对象构成的.View是绘制在屏幕上的用户能与之交互的一个对 ...

  2. android 组件化_你曾遇到的某大厂奇葩问题:Android组件化开发,组件间的Activity页面跳转...

    组件化开发有什么好处? 1.当项目越来越大时,app的业务越来越复杂,会出现业务功能复杂混乱,各功能块.页面相互依赖,相互调用太多导致耦合度高,而采用组件化开发,我们就可以将功能模块合理的划分,降低功 ...

  3. python 全栈开发,Day112(内容回顾,单例模式,路由系统,stark组件)

    python 全栈开发,Day112(内容回顾,单例模式,路由系统,stark组件) 一.内容回顾 类可否作为字典的key 初级 举例: class Foo(object):pass_registry ...

  4. Android之组件化开发

    转载请标明出处:[顾林海的博客] 个人开发的微信小程序,目前功能是书籍推荐,后续会完善一些新功能,希望大家多多支持! ##前言 在以前的项目中都是建一个基础库,项目依赖基础库,主项目中集成了所有的功能 ...

  5. 架构:Android 组件化开发

    前言 强烈推荐先阅读这篇文章 Android 组件化最佳实践 本文是阅读实践后的思考总结,更倾向实践步骤. 组件化开发架构 组件化开发大体就是这样的架构,最关键的是base 和 base_custom ...

  6. 疯狂连连看之开发游戏界面组件一

    疯狂连连看之开发游戏界面组件一 开发游戏界面组件 本游戏的界面组件采用了一个自定义View:GameView,它从View基类派生而出,这个自定义View的功能就是根据游戏状态来绘制游戏界面上的全部方 ...

  7. 微信小程序自定义组件开发即组件间通信详解

    自定义组件开发 1.我的工程目录 pages components 自定义组件 2.定义一个组件名称为toast(目录下文件与页面开发一样.js .wxml .wxss .json文件) 在自定义组件 ...

  8. Vue.js教程-组件化开发

    Vue.js教程-组件化开发 前言 Vue组件化 什么是组件化 Vue单页面开发的解释 组件化思想 组件的使用 原理 实际开发中的使用-父子组件 父子组件传递数据 父传子-props用法 子传父-th ...

  9. 从 0 到 1 上手 Web Components 业务组件库开发

    组件化是前端发展的一个重要方向,它一方面提高开发效率,另一方面降低维护成本.主流的 Vue.js.React 及其延伸的 Ant Design.uniapp.Taro 等都是组件框架. ​ Web C ...

最新文章

  1. linux关机正确方法
  2. [wp7游戏]wp7~~飞行射击精品游戏~~集合贴
  3. Centos7修改Docker默认存储位置
  4. qgridlayout 滚动时固定第一行_滚动直线导轨副的安装技术
  5. mongodb 入门 启动mongodb 无法启动 问题 非正常关闭
  6. Redis 服务安装
  7. 解决Latex报错latex Unknown float option `H‘.
  8. MYSQL5.7---ONLY_FULL_GROUP_BY 异常处理
  9. shell(九)几个字符转换命令
  10. 利用双向注意流进行机器理解
  11. linux openssh升级8.1,ssh服务升级8.1
  12. win10访问不了win7文件服务器,win10和win7共享文件教程 win10和win7共享文件无法访问...
  13. 【转帖】mysql锁机制
  14. RabbitMQ-启动各种报错,windows环境,RabbitMQPlugin configuration unchanged
  15. 谷歌中国推出10款有趣的小工具
  16. 【非原创】Ubuntu14.04+cuda6.5+opencv2.4.9+caffe配置记录
  17. 华为5g cpe 虚拟服务器,中国移动科普5G CPE:不换手机也能体验5G
  18. 从运维角度聊下:如何维护一套 DevOps 系统
  19. php wenjian shangchuan shijian,PHP时间和日期 - osc_nnp3dgfb的个人空间 - OSCHINA - 中文开源技术交流社区...
  20. 年产2万吨山楂酒工厂的设计-装瓶工段及车间的设计(lunwen+任务书+开题+选题表+cad图纸)

热门文章

  1. 史上最大规模机器人“面相”调查:157张脸背后的人类感受
  2. 亚洲首个无人船试验基地建于中国珠海,无人船或将助力南海巡逻
  3. 苹果自动驾驶测试车近距离实拍,头顶新添传感器和硬件
  4. 《脱颖而出——成功网店经营之道》一2.5 后方——不可忽视的金库
  5. 玩转Excel系列-SUMIF函数实例教程
  6. Cent OS 重置root密码
  7. win8.1远程桌面连接2008显示正在加密远程连接
  8. SQL server 2008 中的五个系统数据库详解
  9. POJ-1328 Radar Installation 贪心
  10. Ajax不起作用....