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按行读取文件的实现方法【小文件和大文件读取】
Sep 19 Python
python中实现k-means聚类算法详解
Nov 11 Python
Django REST为文件属性输出完整URL的方法
Dec 18 Python
windows下 兼容Python2和Python3的解决方法
Dec 05 Python
Python二叉树的遍历操作示例【前序遍历,中序遍历,后序遍历,层序遍历】
Dec 24 Python
Python向excel中写入数据的方法
May 05 Python
pyQt5实时刷新界面的示例
Jun 25 Python
Python使用Pandas库实现MySQL数据库的读写
Jul 06 Python
python异常触发及自定义异常类解析
Aug 06 Python
python3.6、opencv安装环境搭建过程(图文教程)
Nov 05 Python
python爬虫把url链接编码成gbk2312格式过程解析
Jun 08 Python
keras实现多GPU或指定GPU的使用介绍
Jun 17 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中查询SQL Server或Sybase时TEXT字段被截断的解决方法
2009/03/10 PHP
php smarty函数扩展
2010/03/15 PHP
PHP下通过file_get_contents的代理使用方法
2011/02/16 PHP
PHP观察者模式示例【Laravel框架中有用到】
2018/06/15 PHP
Yii2框架redis基本应用示例
2018/07/13 PHP
laravel 实现上传图片到本地和前台访问示例
2019/10/21 PHP
YUI 读码日记之 YAHOO.util.Dom - Part.1
2008/03/22 Javascript
基于jquery的finkyUI插件与Ajax实现页面数据加载功能
2010/12/03 Javascript
JavaScript call apply使用 JavaScript对象的方法绑定到DOM事件后this指向问题
2011/09/28 Javascript
基于jquery实现点击左右按钮图片横向滚动
2013/04/11 Javascript
Jquery chosen动态设置值实例介绍
2013/08/08 Javascript
jquery 页面滚动到底部自动加载插件集合
2014/01/31 Javascript
编程语言JavaScript简介
2014/10/16 Javascript
jQuery支持添加事件的日历特效代码分享(3种样式)
2015/08/24 Javascript
JavaScript编写Chrome扩展实现与浏览器的交互及时间通知
2016/05/16 Javascript
基于JS实现无缝滚动思路及代码分享
2016/06/07 Javascript
vue动画之点击按钮往上渐渐显示出来的实例
2018/09/29 Javascript
vue-router结合vuex实现用户权限控制功能
2019/11/14 Javascript
24个ES6方法解决JS实际开发问题(小结)
2020/05/31 Javascript
[02:10]三分钟回顾完美世界城市挑战赛
2019/01/24 DOTA
[00:14]PWL:老朋友Mushi拍VLOG与中国玩家问好
2020/11/04 DOTA
[48:24]完美世界DOTA2联赛循环赛LBZS vs Forest 第一场 10月30日
2020/10/31 DOTA
Python读写unicode文件的方法
2015/07/10 Python
python append、extend与insert的区别
2016/10/13 Python
Python实现SSH远程登陆,并执行命令的方法(分享)
2017/05/08 Python
安装Python的教程-Windows
2017/07/22 Python
Python 使用with上下文实现计时功能
2018/03/09 Python
python 批量修改/替换数据的实例
2018/07/25 Python
详解numpy.meshgrid()方法使用
2019/08/01 Python
Python使用docx模块实现刷题功能代码
2020/02/13 Python
俄罗斯游戏商店:Buka
2020/03/01 全球购物
什么是反射?如何实现反射?
2016/07/25 面试题
50道外企软件测试面试题
2014/08/18 面试题
营销与策划专业毕业生求职信
2013/11/01 职场文书
校园达人秀策划书
2014/01/12 职场文书
拓展策划方案
2014/06/03 职场文书