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实现的多线程同步与互斥锁功能示例
Nov 30 Python
python 接口返回的json字符串实例
Mar 27 Python
python操作excel文件并输出txt文件的实例
Jul 10 Python
Django实战之用户认证(用户登录与注销)
Jul 16 Python
python中dict使用方法详解
Jul 17 Python
python实现while循环打印星星的四种形状
Nov 23 Python
对pytorch的函数中的group参数的作用介绍
Feb 18 Python
Pyecharts 动态地图 geo()和map()的安装与用法详解
Mar 25 Python
Python ckeditor富文本编辑器代码实例解析
Jun 22 Python
利用Python实现Json序列化库的方法步骤
Sep 09 Python
python线程池 ThreadPoolExecutor 的用法示例
Oct 10 Python
Python中itertools库的四个函数介绍
Apr 06 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
十大“创意”战术!
2020/03/04 星际争霸
2019十大人气国漫
2020/03/13 国漫
基于mysql的bbs设计(三)
2006/10/09 PHP
yum命令安装php7和相关扩展
2016/07/04 PHP
thinkPHP5.1框架中Request类四种调用方式示例
2019/08/03 PHP
PHP中关于php.ini参数优化详解
2020/02/28 PHP
PHP实现爬虫爬取图片代码实例
2021/03/03 PHP
Extjs入门之动态加载树代码
2010/04/09 Javascript
javascript权威指南 学习笔记之变量作用域分享
2011/09/28 Javascript
基于jquery的弹出提示框始终处于窗口的居中位置(类似于alert弹出框的效果)
2011/09/28 Javascript
jQuery照片伸缩效果不影响其他元素的布局
2014/05/09 Javascript
兼容IE、firefox以及chrome的js获取时间(getFullYear)
2014/07/04 Javascript
Jquery仿IGoogle实现可拖动窗口示例代码
2014/08/22 Javascript
BootStrap下jQuery自动完成的样式调整
2016/05/30 Javascript
jQuery EasyUI之验证框validatebox实例详解
2017/04/10 jQuery
React Native时间转换格式工具类分享
2017/10/24 Javascript
jQuery实现的回车触发按钮事件功能示例
2018/03/25 jQuery
js异步接口并发数量控制的方法示例
2020/11/22 Javascript
python操作sqlite的CRUD实例分析
2015/05/08 Python
在Python中处理时间之clock()方法的使用
2015/05/22 Python
Python pickle模块用法实例分析
2015/05/27 Python
Python实现的生成格雷码功能示例
2018/01/24 Python
使用pandas将numpy中的数组数据保存到csv文件的方法
2018/06/14 Python
解决使用pycharm提交代码时冲突之后文件丢失找回的方法
2018/08/05 Python
浅析Python函数式编程
2018/10/06 Python
python爬虫爬取笔趣网小说网站过程图解
2019/11/18 Python
Python利用逻辑回归分类实现模板
2020/02/15 Python
小白教你PyCharm从下载到安装再到科学使用PyCharm2020最新激活码
2020/09/25 Python
《盲人摸象》教学反思
2014/02/16 职场文书
搞笑征婚广告词
2014/03/17 职场文书
毕业生应聘求职信
2014/07/10 职场文书
船舶工程技术专业求职信
2014/08/07 职场文书
2014派出所所长群众路线对照检查材料思想汇报
2014/09/18 职场文书
使用python如何删除同一文件夹下相似的图片
2021/05/07 Python
Python基础之进程详解
2021/05/21 Python
nginx rewrite功能使用场景分析
2022/05/30 Servers