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将图片转换为字符画的方法
Jun 16 Python
在python中使用requests 模拟浏览器发送请求数据的方法
Dec 26 Python
python 画三维图像 曲面图和散点图的示例
Dec 29 Python
Python Pywavelet 小波阈值实例
Jan 09 Python
python使用requests.session模拟登录
Aug 09 Python
Python字典生成式、集合生成式、生成器用法实例分析
Jan 07 Python
keras-siamese用自己的数据集实现详解
Jun 10 Python
python中delattr删除对象方法的代码分析
Dec 15 Python
pip 20.3 新版本发布!即将抛弃 Python 2.x(推荐)
Dec 16 Python
python中if嵌套命令实例讲解
Feb 25 Python
Pytest实现setup和teardown的详细使用详解
Apr 17 Python
linux中nohup和后台运行进程查看及终止
Jun 24 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将XML转数组过程详解
2013/11/13 PHP
php读取csv文件并输出的方法
2015/03/14 PHP
实例介绍PHP删除数组中的重复元素
2019/03/03 PHP
Centos7安装swoole扩展操作示例
2020/03/26 PHP
利用JS来控制键盘的上下左右键(示例代码)
2013/12/14 Javascript
js之ActiveX控件使用说明 new ActiveXObject()
2014/03/03 Javascript
自写的jQuery异步加载数据添加事件
2014/05/15 Javascript
js中for in语句的用法讲解
2015/04/24 Javascript
javascript运动框架用法实例分析(实现放大与缩小效果)
2016/01/08 Javascript
JS只能输入正整数的简单实例
2016/10/07 Javascript
NodeJS使用formidable实现文件上传
2016/10/27 NodeJs
非常实用的vue导航钩子
2017/03/20 Javascript
ES6扩展运算符的用途实例详解
2017/08/20 Javascript
基于node.js的fs核心模块读写文件操作(实例讲解)
2017/09/10 Javascript
AngularJS的$location使用方法详解
2017/10/19 Javascript
vue.js语法及常用指令
2017/10/29 Javascript
微信小程序 组件的外部样式externalClasses使用详解
2019/09/06 Javascript
微信域名检测接口调用演示步骤(含PHP、Python)
2019/12/08 Javascript
JavaScript字符和ASCII实现互相转换
2020/06/03 Javascript
python调用windows api锁定计算机示例
2014/04/17 Python
详解Python中dict与set的使用
2015/08/10 Python
django重新生成数据库中的某张表方法
2019/08/28 Python
详解Python图像处理库Pillow常用使用方法
2019/09/02 Python
Django中使用haystack+whoosh实现搜索功能
2019/10/08 Python
Python加密模块的hashlib,hmac模块使用解析
2020/01/02 Python
使用python把xmind转换成excel测试用例的实现代码
2020/10/12 Python
python使用matplotlib的savefig保存时图片保存不完整的问题
2021/01/08 Python
Python实现钉钉/企业微信自动打卡的示例代码
2021/02/02 Python
《我要的是葫芦》教学反思
2014/02/23 职场文书
小学毕业感言500字
2014/02/28 职场文书
学雷锋志愿服务月活动总结
2014/03/09 职场文书
幼儿园教师岗位职责
2015/04/02 职场文书
教师法制教育培训学习心得体会
2016/01/14 职场文书
python自动化调用百度api解决验证码
2021/04/13 Python
go结构体嵌套的切片数组操作
2021/04/28 Golang
不想升级Win11?教你彻底锁定老版Windows系统的方法(附下载地址)
2022/09/23 数码科技