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字符串详细介绍
May 09 Python
Python守护进程和脚本单例运行详解
Jan 06 Python
Python设计模式之观察者模式原理与用法详解
Jan 16 Python
python实现海螺图片的方法示例
May 12 Python
python将excel转换为csv的代码方法总结
Jul 03 Python
Django基础知识 web框架的本质详解
Jul 18 Python
Django 创建/删除用户的示例代码
Jul 24 Python
python 3.74 运行import numpy as np 报错lib\site-packages\numpy\__init__.py
Oct 06 Python
Python unittest单元测试openpyxl实现过程解析
May 27 Python
Pycharm2020.1安装无法启动问题即设置中文插件的方法
Aug 07 Python
python基于Kivy写一个图形桌面时钟程序
Jan 28 Python
利用Python实现模拟登录知乎
May 25 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结合飞信 免费天气预报短信
2009/05/07 PHP
php获取文件夹路径内的图片以及分页显示示例
2014/03/11 PHP
thinkphp获取栏目和文章当前位置的方法
2014/10/29 PHP
分享一则PHP定义函数代码
2015/02/26 PHP
YII框架常用技巧总结
2019/04/27 PHP
Thinkphp 框架扩展之行为扩展原理与实现方法分析
2020/04/23 PHP
基于jQuery的星级评分插件
2011/08/12 Javascript
Jquery异步请求数据实例代码
2011/12/28 Javascript
jQuery操作input值的各种方法总结
2013/11/21 Javascript
js判断元素是否隐藏的方法
2014/06/09 Javascript
js操作table元素实现表格行列新增、删除技巧总结
2015/11/18 Javascript
原生js实现autocomplete插件
2016/04/14 Javascript
Ubuntu系统下Angularjs开发环境安装
2016/09/01 Javascript
EditPlus中的正则表达式 实战(4)
2016/12/15 Javascript
详解nodejs微信公众号开发——2.自动回复
2017/04/10 NodeJs
JavaScript 用fetch 实现异步下载文件功能
2017/07/21 Javascript
js封装成插件_Canvas统计图插件编写实例
2017/09/12 Javascript
微信小程序实现日历签到
2020/09/21 Javascript
Javascript实现贪吃蛇小游戏(含详细注释)
2020/10/23 Javascript
node koa2 ssr项目搭建的方法步骤
2020/12/11 Javascript
vue 实现图片懒加载功能
2020/12/31 Vue.js
将Django框架和遗留的Web应用集成的方法
2015/07/24 Python
Python 3中print函数的使用方法总结
2017/08/08 Python
关于Django外键赋值问题详解
2017/08/13 Python
Python基于OpenCV实现视频的人脸检测
2018/01/23 Python
python3使用flask编写注册post接口的方法
2018/12/28 Python
python 猴子补丁(monkey patch)
2019/06/26 Python
python 实现手机自动拨打电话的方法(通话压力测试)
2019/08/08 Python
全球领先美式家具品牌:Ashley爱室丽家居
2017/08/07 全球购物
中东奢侈品市场:Coveti
2019/05/12 全球购物
PyQt QMainWindow的使用示例
2021/03/24 Python
淘宝店铺营销方案
2014/02/13 职场文书
反腐倡廉主题教育活动总结
2015/05/07 职场文书
反邪教警示教育活动总结
2015/05/09 职场文书
Win11绿屏怎么办?Win11绿屏死机的解决方法
2021/11/21 数码科技
Win11怎么跳过联网验机 ?Win11跳过联网验机激活教程
2022/04/05 数码科技