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中join和split用法实例
Apr 14 Python
python使用opencv进行人脸识别
Apr 07 Python
python中reduce()函数的使用方法示例
Sep 29 Python
Python爬虫包BeautifulSoup学习实例(五)
Jun 17 Python
Pandas GroupBy对象 索引与迭代方法
Nov 16 Python
uwsgi+nginx部署Django项目操作示例
Dec 04 Python
对Python捕获控制台输出流的方法详解
Jan 07 Python
Python collections中的双向队列deque简单介绍详解
Nov 04 Python
Python大数据之从网页上爬取数据的方法详解
Nov 16 Python
Python 从attribute到property详解
Mar 05 Python
Python grpc超时机制代码示例
Sep 14 Python
基于PyQT5制作一个桌面摸鱼工具
Feb 15 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 strncasecmp字符串比较的小技巧
2011/01/04 PHP
浅谈discuz密码加密的方式
2014/05/22 PHP
js 显示base64编码的二进制流网页图片
2014/04/04 Javascript
Javascript排序算法之计数排序的实例
2014/04/05 Javascript
js如何判断用户是否是用微信浏览器
2014/06/05 Javascript
$.each遍历对象、数组的属性值并进行处理
2014/07/18 Javascript
Javascript冒泡排序算法详解
2014/12/03 Javascript
AngularJS基础知识笔记之表格
2015/05/10 Javascript
用js实现放大镜的效果的简单实例
2016/05/23 Javascript
JavaScript的==运算详解
2016/07/20 Javascript
JavaScript性能优化总结之加载与执行
2016/08/11 Javascript
ES6新特性之数组、Math和扩展操作符用法示例
2017/04/01 Javascript
jQuery EasyUI结合zTree树形结构制作web页面
2017/09/01 jQuery
浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件
2017/12/07 Javascript
spirngmvc js传递复杂json参数到controller的实例
2018/03/29 Javascript
浅谈vue后台管理系统权限控制思考与实践
2018/12/19 Javascript
关于layui toolbar和template的结合使用方法
2019/09/19 Javascript
Javascript生成器(Generator)的介绍与使用
2021/01/31 Javascript
[45:17]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第三场 1月9日
2021/03/11 DOTA
Python简单实现两个任意字符串乘积的方法示例
2018/04/12 Python
python3之模块psutil系统性能信息使用
2018/05/30 Python
Python学习笔记之While循环用法分析
2019/08/14 Python
Django 拼接两个queryset 或是两个不可以相加的对象实例
2020/03/28 Python
python 根据列表批量下载网易云音乐的免费音乐
2020/12/03 Python
Amaze UI 文件选择域的示例代码
2020/08/26 HTML / CSS
英国最大的经认证的有机超市:Planet Organic
2018/02/02 全球购物
波兰电子产品购物网站:Vobis
2019/05/26 全球购物
师范生自我鉴定范文
2013/10/05 职场文书
饮料业务员岗位职责
2013/12/15 职场文书
党的群众路线领导班子整改方案
2014/09/27 职场文书
2014年旅游局法制宣传日活动总结
2014/11/01 职场文书
总经理助理岗位职责
2015/01/31 职场文书
开会通知短信大全
2015/04/20 职场文书
2019年暑期法院实习报告
2019/12/18 职场文书
python中 Flask Web 表单的使用方法
2022/05/20 Python
MySQL运行报错:“Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre”解决方法
2022/06/14 MySQL