django admin组件使用方法详解


Posted in Python onJuly 19, 2019

关于admin:

(1) admin的概述:

admin是一个django子代的组件,当创建一个项目会后,就会在settings文件的 INSTALLED_APPS 中自动注册,另外在urls.py 文件中同样存在admin的路由

INSTALLED_APPS = [
 #自带并且注册的一个组件即app
  'django.contrib.admin',
  'django.contrib.auth',
  'django.contrib.contenttypes',
urlpatterns = [
  # 自动存在的admin路由
  url(r'^admin/', admin.site.urls),
  url(r'^stark/', site.urls),

]

(2) admin 的执行流程

当django程序加载的时候,自动循环加载已经注册的APP中的admin.py文件然后执行

#在admin.py文件中有一个__init__文件 ,其中有代码如下
#意思是:程序的启动自动寻找名为admin的py文件,然后执行
def autodiscover():
  autodiscover_modules('admin', register_to=site)
#具体的方法如下:
def autodiscover_modules(*args, **kwargs):
  """
  Auto-discover INSTALLED_APPS modules and fail silently when
  not present. This forces an import on them to register any admin bits they
  may want.

  You may provide a register_to keyword parameter as a way to access a
  registry. This register_to object must have a _registry instance variable
  to access it.
  """

执行admin.py文件中的内容

# 在django启动时候,系统自动加载
from django.contrib import admin
#导入该APP下的models
from DRF import models
#此处是一个单例模式 admion.site 
admin.site.register(models.Publisher)

单例模式site 这里应用的是一个单例模式,对于AdminSite类的一个单例模式,执行的每一个App中的每一个admin.site都是一个对象

# AdminSite 类
class AdminSite(object):
    ...  
    def __init__(self, name='admin'):
      self._registry = {} # model_class class -> admin_class instance
      self.name = name
      self._actions = {'delete_selected': actions.delete_selected}
      self._global_actions = self._actions.copy()
      all_sites.add(self)
    ....
site = AdminSite()

执行register方法

# AdminSite中的register 方法
  def register(self, model_or_iterable, admin_class=None, **options):
    """
    Registers the given model(s) with the given admin class.
    The model(s) should be Model classes, not instances.
    If an admin class isn't given, it will use ModelAdmin (the default
    admin options). If keyword arguments are given -- e.g., list_display --
    they'll be applied as options to the admin class.
    If a model is already registered, this will raise AlreadyRegistered.
    If a model is abstract, this will raise ImproperlyConfigured.
    """

知识补充: 单例模式

a.py

class AdminSite(object):

  def __init__(self):
    self._registry = {}
obj1 = AdminSite()

b.py

import a
a.obj1._registry['k2'] = 666

c.py

import a
a.obj1._registry['k1'] = 123
print(a.obj1._registry)

单例模式的实现方法

1:使用模块

Python的模块就是天然的单例模式。

因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。

因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。

例如:

class V1(object):
  def foo(self)
    pass
V1 = V1()

将上面代码保存在文件test.py,要使用时,直接在其他文件中导入此文件中的对象,这个对象既是单例模式的对象

如:from a import V1

2:使用装饰器

def Singleton(cls):
  _instance = {}
  def _singleton(*args, **kargs):
    if cls not in _instance:
      _instance[cls] = cls(*args, **kargs)
    return _instance[cls]
  return _singleton
@Singleton
class A(object):
  a = 1
  def __init__(self, x=0):
    self.x = x
a1 = A(2)
a2 = A(3)

3:使用类

4:基于__new__方法实现

当我们实例化一个对象时,是先执行了类的__new__方法

当:(我们没写时,默认调用object.__new__),实例化对象;然后再执行类的__init__方法,对这个对象进行初始化,所有我们可以基于这个,实现单例模式

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python基础教程之实现石头剪刀布游戏示例
Feb 11 Python
python对指定目录下文件进行批量重命名的方法
Apr 18 Python
详解Python的Flask框架中生成SECRET_KEY密钥的方法
Jun 07 Python
python中hashlib模块用法示例
Oct 30 Python
Python 实现淘宝秒杀的示例代码
Jan 02 Python
python email smtplib模块发送邮件代码实例
Apr 26 Python
django+mysql的使用示例
Nov 23 Python
元组列表字典(莫烦python基础)
Apr 03 Python
解决tensorboard多个events文件显示紊乱的问题
Feb 15 Python
keras实现VGG16方式(预测一张图片)
Jul 07 Python
Python3爬虫中Ajax的用法
Jul 10 Python
五分钟带你搞懂python 迭代器与生成器
Aug 30 Python
使用python分析统计自己微信朋友的信息
Jul 19 #Python
django url到views参数传递的实例
Jul 19 #Python
Django  ORM 练习题及答案
Jul 19 #Python
Django之提交表单与前后端交互的方法
Jul 19 #Python
解决Python3 抓取微信账单信息问题
Jul 19 #Python
Django 数据库同步操作技巧详解
Jul 19 #Python
浅谈Python中函数的定义及其调用方法
Jul 19 #Python
You might like
PHP中一个控制字符串输出的函数
2006/10/09 PHP
PHP jQuery+Ajax结合写批量删除功能
2017/05/19 PHP
不常用但很实用的PHP预定义变量分析
2019/06/25 PHP
js 创建快捷方式的代码(fso)
2010/11/19 Javascript
jquery中通过过滤器获取表单元素的实现代码
2011/07/05 Javascript
JS高级笔记
2011/07/13 Javascript
解决jquery的datepicker的本地化以及Today问题
2012/05/23 Javascript
js的hasownproperty使用示例
2014/03/02 Javascript
jQuery UI设置固定日期选择特效代码分享
2015/08/27 Javascript
JavaScript实现的多种鼠标拖放效果
2015/11/03 Javascript
JS插件overlib用法实例详解
2015/12/26 Javascript
jQuery ajax的功能实现方法详解
2017/01/06 Javascript
从零学习node.js之模块规范(一)
2017/02/21 Javascript
js中less常用的方法小结
2017/08/09 Javascript
JS实现简单表格排序操作示例
2017/10/07 Javascript
React Native中Navigator的使用方法示例
2017/10/13 Javascript
js如何找出字符串中的最长回文串
2018/06/04 Javascript
jQuery实现ajax回调函数带入参数的方法示例
2018/06/26 jQuery
JS中数据结构之栈
2019/01/01 Javascript
微信小程序转发事件实现解析
2019/10/22 Javascript
JS中数组实现代码(倒序遍历数组,数组连接字符串)
2019/12/29 Javascript
深入理解redux之compose的具体应用
2020/01/12 Javascript
Python微信库:itchat的用法详解
2017/08/14 Python
Python实现购物车功能的方法分析
2017/11/10 Python
vscode 远程调试python的方法
2017/12/01 Python
python仿evething的文件搜索器实例代码
2019/05/13 Python
opencv 获取rtsp流媒体视频的实现方法
2019/08/23 Python
PyPDF2读取PDF文件内容保存到本地TXT实例
2020/05/12 Python
中国医药集团国药在线:国药网
2017/02/06 全球购物
MIXIT官网:俄罗斯最大的化妆品公司之一
2020/01/25 全球购物
函授本科毕业自我鉴定
2013/10/09 职场文书
《愚公移山》教学反思
2014/02/20 职场文书
先进教师个人总结
2015/02/11 职场文书
2015年公司工作总结
2015/04/25 职场文书
解约证明模板
2015/06/19 职场文书
mysql数据库入门第一步之创建表
2021/05/14 MySQL