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中bisect的用法
Sep 23 Python
python开发之tkinter实现图形随鼠标移动的方法
Nov 11 Python
Python排序搜索基本算法之堆排序实例详解
Dec 08 Python
Python中pillow知识点学习
Apr 30 Python
Python把csv数据写入list和字典类型的变量脚本方法
Jun 15 Python
Pycharm新手教程(只需要看这篇就够了)
Jun 18 Python
pytorch 预训练层的使用方法
Aug 20 Python
python 正则表达式参数替换实例详解
Jan 17 Python
Python2与Python3的区别详解
Feb 09 Python
浅谈spring boot 集成 log4j 解决与logback冲突的问题
Feb 20 Python
python如何导入依赖包
Jul 13 Python
Python下opencv库的安装过程及问题汇总
Jun 11 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-fpm配置详解
2014/02/12 PHP
PHP使用Alexa API获取网站的Alexa排名例子
2014/06/12 PHP
php实现微信公众平台账号自定义菜单类
2015/10/11 PHP
PHP执行shell脚本运行程序不产生core文件的方法
2016/12/28 PHP
js tab效果的实现代码
2009/12/26 Javascript
分享十五个最佳jQuery 幻灯插件和教程
2010/03/27 Javascript
JavaScript继承基础讲解(原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承)
2014/08/16 Javascript
iframe如何动态创建及释放其所占内存
2014/09/03 Javascript
JavaScript获得url所有参数键值表的方法
2015/03/21 Javascript
JavaScript控制网页层收起和展开效果的方法
2015/04/15 Javascript
js限制文本框只能输入中文的方法
2015/08/11 Javascript
Javascript设计模式理论与编程实战之简单工厂模式
2015/11/03 Javascript
JS判断浏览器是否安装flash插件的简单方法
2016/09/13 Javascript
javascript入门之window对象【新手必看】
2016/11/22 Javascript
mac上node.js环境的安装测试
2017/07/03 Javascript
Node.js使用Koa搭建 基础项目
2018/01/08 Javascript
JS逻辑运算符短路操作实例分析
2018/07/09 Javascript
基于Vue实现可以拖拽的树形表格实例详解
2018/10/18 Javascript
使用jQuery动态设置单选框的选中效果
2018/12/06 jQuery
微信小程序实现九宫格抽奖
2020/04/15 Javascript
JS实现吸顶特效
2020/01/08 Javascript
[02:51]DOTA2战队出征照拍摄花絮 TI3明星化身时尚男模
2013/07/22 DOTA
[01:14:34]DOTA2上海特级锦标赛C组资格赛#2 LGD VS Newbee第一局
2016/02/28 DOTA
Python+selenium实现自动循环扔QQ邮箱漂流瓶
2018/05/29 Python
Python实现蒙特卡洛算法小实验过程详解
2019/07/12 Python
浅谈Python中的字符串
2020/06/10 Python
Python+OpenCV图像处理——图像二值化的实现
2020/10/24 Python
Gap工厂店:Gap Factory
2017/11/02 全球购物
干部培训自我鉴定
2014/01/22 职场文书
企业党员一句话承诺
2014/05/30 职场文书
2014院党委领导班子及其成员群众路线对照检查材料思想汇报
2014/10/04 职场文书
2014年财务工作总结与计划
2014/12/08 职场文书
幼儿园辞职书
2015/02/26 职场文书
撤诉申请怎么写
2015/05/19 职场文书
2016年大学生社区服务活动总结
2016/04/06 职场文书
详解Nginx 工作原理
2021/03/31 Servers