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. python post与get的区别_python中get和post有什么区别
  2. 皮一皮:这才是书法的最高境界...
  3. 交换机出现err-disable的原因及解决方法
  4. 学习记录1-python图片分割transforms方法
  5. python利用cookie模拟登录
  6. 利用哈希表和dfs解决LeetCode 399. Evaluate Division
  7. IE6PNG8PNG24test
  8. linux多线程学习(四)——互斥锁线程控制
  9. PowerShell 2.0远程管理之隐式远程管理
  10. 双机热备篇 VRRP与VGMP的故事(2)
  11. hdu 1003 Max Sum 简单动态规划
  12. WebSphere 集群环境下配置 Quartz集群
  13. P2P终结者的工作原理
  14. 【Android安全】JEB技巧汇总
  15. C++ 实现计算24点
  16. 五款优秀重复文件查找工具
  17. DAX:RELATED 和 RELATEDTABLE
  18. 语义分割yolov5 v4.0 baseline快速复现 快速跑通 图像分割 图像分类 重新训练,训练结果,测试结果,实验图片-20210227
  19. 如何评价 2021 考研政治题,难度如何?
  20. Python全栈(八)Flask项目实战之6.前台注册功能开发

热门文章

  1. es支持的操作及性能
  2. 构建基于流程的多维度企业管理体系
  3. [Linux]局域网设置-远程登录GDMSETUP
  4. 英语总结系列(二十七):重复就是力量
  5. 悬赏17万:美国“知乎”的沙雕问题,需要AI来识别
  6. YY创始人体内植入芯片真相调查
  7. GitHub超过2600星的TensorFlow教程,简洁清晰还不太难丨资源
  8. Python可视化工具Matplotlib 3.0版出炉,改进默认后端选择,饼图终于变圆了
  9. 不造AI杀人武器当然好,但牛津学者觉得马斯克们忽略了重点
  10. 谷歌提出深度CNN模型NIMA:帮你挑选清晰且有美感的图片