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升级提示Tkinter模块找不到的解决方法
Aug 22 Python
Python中的装饰器用法详解
Jan 14 Python
Python字符串中查找子串小技巧
Apr 10 Python
在Python 字典中一键对应多个值的实例
Feb 03 Python
python浪漫表白源码
Apr 05 Python
python递归法实现简易连连看小游戏
Mar 25 Python
python定间隔取点(np.linspace)的实现
Nov 27 Python
python的json中方法及jsonpath模块用法分析
Dec 06 Python
Python2和Python3中@abstractmethod使用方法
Feb 04 Python
python GUI库图形界面开发之PyQt5访问系统剪切板QClipboard类详细使用方法与实例
Feb 27 Python
基于python模拟TCP3次握手连接及发送数据
Nov 06 Python
Flask搭建一个API服务器的步骤
May 28 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写的带缓存数据功能的mysqli类
2012/09/06 PHP
windwos下使用php连接oracle数据库的过程分享
2014/05/26 PHP
thinkphp微信开之安全模式消息加密解密不成功的解决办法
2015/12/02 PHP
如何解决PHP使用mysql_query查询超大结果集超内存问题
2016/03/14 PHP
解析PHP的Yii框架中cookie和session功能的相关操作
2016/03/17 PHP
PHP7扩展开发之hello word实现方法详解
2018/01/15 PHP
PHP实现生成数据字典功能示例
2018/05/24 PHP
laravel 修改.htaccess文件 重定向public的解决方法
2019/10/12 PHP
textContent在Firefox下与innerText等效的属性
2007/05/12 Javascript
javascript 面向对象 function类
2010/05/13 Javascript
JavaScript实现控制打开文件另存为对话框的方法
2015/04/17 Javascript
JavaScript实现鼠标点击后层展开效果的方法
2015/05/13 Javascript
深入理解js中this的用法
2016/05/28 Javascript
微信小程序-消息提示框实例
2016/11/24 Javascript
js学习总结_选项卡封装(实例讲解)
2017/07/13 Javascript
layer.close()关闭进度条和Iframe窗的方法
2018/08/17 Javascript
vuejs中监听窗口关闭和窗口刷新事件的方法
2018/09/21 Javascript
详解vue 路由跳转四种方式 (带参数)
2019/04/28 Javascript
ES6 Class中实现私有属性的一些方法总结
2019/07/08 Javascript
vue中组件通信的八种方式(值得收藏!)
2019/08/09 Javascript
vue 实现模糊检索并根据其他字符的首字母顺序排列
2019/09/19 Javascript
vue父组件给子组件的组件传值provide inject的方法
2019/10/23 Javascript
vue实现在v-html的html字符串中绑定事件
2019/10/28 Javascript
详解python3实现的web端json通信协议
2016/12/29 Python
python脚本生成caffe train_list.txt的方法
2018/04/27 Python
Python实现定时自动关闭的tkinter窗口方法
2019/02/16 Python
Python实现把多维数组展开成DataFrame
2019/11/30 Python
Python reduce函数作用及实例解析
2020/05/08 Python
Python Pillow(PIL)库的用法详解
2020/09/19 Python
彼得罗夫美国官网:Peter Thomas Roth美国(青瓜面膜)
2017/11/05 全球购物
任意存:BOXFUL
2018/05/21 全球购物
opencv实现图像平移效果
2021/03/24 Python
2014年项目经理工作总结
2014/11/24 职场文书
会议主持词结束语
2015/07/03 职场文书
党组织结对共建协议书
2016/03/23 职场文书
详解Redis在SpringBoot工程中的综合应用
2021/10/16 Redis