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的Django框架中URLconf相关的一些技巧整理
Jul 18 Python
Python中对元组和列表按条件进行排序的方法示例
Nov 10 Python
python实现朴素贝叶斯分类器
Mar 28 Python
Django+Ajax+jQuery实现网页动态更新的实例
May 28 Python
python实现简易内存监控
Jun 21 Python
机器学习之KNN算法原理及Python实现方法详解
Jul 09 Python
python实现公司年会抽奖程序
Jan 22 Python
centos6.5安装python3.7.1之后无法使用pip的解决方案
Feb 14 Python
Python 通过打码平台实现验证码的实现
May 13 Python
python3 assert 断言的使用详解 (区别于python2)
Nov 27 Python
python3.8与pyinstaller冲突问题的快速解决方法
Jan 16 Python
详解分布式系统中如何用python实现Paxos
May 18 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
Smarty模板快速入门
2007/01/04 PHP
Yii调试SQL的常用方法
2014/07/09 PHP
php similar_text()函数的定义和用法
2016/05/12 PHP
javascript 数组学习资料收集
2010/04/11 Javascript
基于jquery的回到页面顶部按钮
2011/06/27 Javascript
动态的绑定事件addEventListener方法的使用
2014/01/24 Javascript
jQuery中使用data()方法读取HTML5自定义属性data-*实例
2014/04/11 Javascript
Javascript 绘制 sin 曲线过程附图
2014/08/21 Javascript
jQuery向后台传入json格式数据的方法
2015/02/13 Javascript
在Javascript中处理字符串之big()方法的使用
2015/06/08 Javascript
JQuery控制图片由中心点逐渐放大效果
2016/06/26 Javascript
浅析JS中回调函数及用法
2018/07/25 Javascript
小程序实现列表删除功能
2018/10/30 Javascript
Vue框架TypeScript装饰器使用指南小结
2019/02/18 Javascript
搭建一个Koa后端项目脚手架的方法步骤
2019/05/30 Javascript
在JavaScript中实现链式调用的实现
2019/12/24 Javascript
python去掉字符串中重复字符的方法
2014/02/27 Python
Python 分析Nginx访问日志并保存到MySQL数据库实例
2014/03/13 Python
Python基于有道实现英汉字典功能
2015/07/25 Python
Python实现自动添加脚本头信息的示例代码
2016/09/02 Python
Python实现压缩和解压缩ZIP文件的方法分析
2017/09/28 Python
python中文分词,使用结巴分词对python进行分词(实例讲解)
2017/11/14 Python
python使用suds调用webservice接口的方法
2019/01/03 Python
python使用递归的方式建立二叉树
2019/07/03 Python
Python使用微信itchat接口实现查看自己微信的信息功能详解
2019/08/22 Python
将python2.7添加进64位系统的注册表方式
2019/11/20 Python
matplotlib grid()设置网格线外观的实现
2021/02/22 Python
css3 实现圆形旋转倒计时
2018/02/24 HTML / CSS
css3 transform导致子元素固定定位变成绝对定位的方法
2020/03/06 HTML / CSS
英国行业制服供应商:Alexandra
2019/09/14 全球购物
技术人员面试提纲
2013/11/28 职场文书
大学校庆策划书
2014/01/31 职场文书
中学生评语大全
2014/04/18 职场文书
英语复习计划
2015/01/19 职场文书
PHP中strval()函数实例用法
2021/06/07 PHP
python基础入门之普通操作与函数(三)
2021/06/13 Python