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中动态检测编码chardet的使用教程
Jul 06 Python
TF-IDF算法解析与Python实现方法详解
Nov 16 Python
python数据抓取分析的示例代码(python + mongodb)
Dec 25 Python
python实现音乐下载器
Apr 15 Python
Python3.6笔记之将程序运行结果输出到文件的方法
Apr 22 Python
tensorflow实现简单的卷积网络
May 24 Python
在Python中如何传递任意数量的实参的示例代码
Mar 21 Python
Python学习笔记之迭代器和生成器用法实例详解
Aug 08 Python
TensorFlow dataset.shuffle、batch、repeat的使用详解
Jan 21 Python
解决python中import文件夹下面py文件报错问题
Jun 01 Python
python爬取网页版QQ空间,生成各类图表
Jun 02 Python
Python中 range | np.arange | np.linspace三者的区别
Mar 22 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使用ereg验证文件上传的方法
2014/12/16 PHP
php中PDO方式实现数据库的增删改查
2015/05/17 PHP
PHP常用字符串操作函数实例总结(trim、nl2br、addcslashes、uudecode、md5等)
2016/01/09 PHP
Yii2配置Nginx伪静态的方法
2017/05/05 PHP
使用git迁移Laravel项目至新开发环境的步骤详解
2020/04/06 PHP
jquery 插件实现图片延迟加载效果代码
2010/02/06 Javascript
jquery选择器-根据多个属性选择示例代码
2013/10/21 Javascript
jquery 使用简明教程
2014/03/05 Javascript
jQuery中eq()方法用法实例
2015/01/05 Javascript
jQuery关键词说明插件cluetip使用指南
2015/04/21 Javascript
基于JavaScript实现快速转换文本语言(繁体中文和简体中文)
2016/03/07 Javascript
Jquery Easyui表单组件Form使用详解(30)
2016/12/19 Javascript
JS正则表达式之非捕获分组用法实例分析
2016/12/28 Javascript
利用HTML5+Socket.io实现摇一摇控制PC端歌曲切换
2017/01/13 Javascript
Ionic2调用本地SQlite实例
2017/04/22 Javascript
AngularJS表单验证功能分析
2017/05/26 Javascript
Vue 2.5 Level E 发布了: 新功能特性一览
2017/10/24 Javascript
Vue 页面切换效果之 BubbleTransition(推荐)
2018/04/08 Javascript
bootstrapTable+ajax加载数据 refresh更新数据
2018/08/31 Javascript
基于node+websocket+html实现腾讯课堂聊天室聊天功能
2020/03/04 Javascript
详解用js代码触发dom事件的实现方案
2020/06/10 Javascript
[01:13]这,就是刀塔
2014/07/16 DOTA
python实现爬虫下载美女图片
2015/07/14 Python
详解python中xlrd包的安装与处理Excel表格
2016/12/16 Python
python numpy之np.random的随机数函数使用介绍
2019/10/06 Python
Python Selenium 设置元素等待的三种方式
2020/03/18 Python
python 实现图片批量压缩的示例
2020/12/18 Python
Django中的DateTimeField和DateField实现
2021/02/24 Python
纯css3制作网站后台管理面板
2014/12/30 HTML / CSS
Joe Fresh官网:加拿大时尚品牌和零售连锁店
2016/11/30 全球购物
西海岸男士和男童服装:Johnnie-O
2018/03/15 全球购物
采购部岗位职责
2013/11/24 职场文书
高中同学聚会邀请函
2014/01/11 职场文书
数学教研活动总结
2014/07/02 职场文书
检讨书怎么写?
2019/06/21 职场文书
Nginx利用Logrotate实现日志分割
2022/05/20 Servers