一、admin组件使用

  Django本身提供了基于 web 的管理工具。其管理工具是django.contrib的一部分,可在settings.py中的 INSTALLED_APPS 看到:

  1. INSTALLED_APPS = [
  2. 'django.contrib.admin',
  3. 'django.contrib.auth',
  4. 'django.contrib.contenttypes',
  5. 'django.contrib.sessions',
  6. 'django.contrib.messages',
  7. 'django.contrib.staticfiles',
  8. "app01"
  9. ]

  - 在使用admin界面管理数据之前,需要先注册一个超级用户,可在终端通过python manage.py createsuperuser来创建。

二、源码分析

  1、在启动Django时,会自动执行初始化文件里的autodiscover函数,从而循环加载所有已经注册的app中的admin.py文件

  1. def autodiscover():
  2. autodiscover_modules('admin', register_to=site)

  2、执行代码

  1. # 这里为自定制的显示样式
  2. class BookAdmin(admin.ModelAdmin):
  3. list_display = ("title",'publishDate', 'price')
  4.  
  5. admin.site.register(Book, BookAdmin) # model类名,样式类名(不写使用默认样式)
  6. admin.site.register(Publish)

  3、admin.site会实例化一个对象

    - 这里应用的是单例模式,每一个app中的每一个admin.site实例化的对象都是同一个

  4、执行register方法

  1. def register(self, model_or_iterable, admin_class=None, **options):
  2. # model_or_iterable表示扫描到的每一个已注册的model对象
  3. # admin_class传一个类,这个类里面定义的是admin页面的显示样式
  4. if not admin_class:
  5. admin_class = ModelAdmin # ModelAdmin是默认的显示样式
  6. if model in self._registry: # 判断每个model对象是否在_registry字典里
  7. raise AlreadyRegistered('The model %s is already registered' % model.__name__)
  8.  
  9. self._registry[model] = admin_class(model, self) # 以model对象为键,指定的样式类为值存放到_registry里
  10. # 以上无用部分已忽略

  到此,完成全部注册操作

  5、admin的URL配置

  1. # 在某一py文件下写下如下代码
    from django.contrib import admin
    from .models import *
  1. urlpatterns = [
  2. url(r'^admin/', admin.site.urls), #调用AdminSite类下的urls方法。
  3. ]
  1. class AdminSite(object):
  2. def get_urls(self):
  3. from django.conf.urls import url, include
  4. from django.contrib.contenttypes import views as contenttype_views
  5. # 这一装饰器可以在调用视图函数的时候将request传给该函数
  6. def wrap(view, cacheable=False):
  7. def wrapper(*args, **kwargs):
  8. return self.admin_view(view, cacheable)(*args, **kwargs) # admin_view代码已省略
  9. return update_wrapper(wrapper, view)
  10.  
  11. # Admin-site-wide views.
  12. urlpatterns = [
  13. url(r'^$', wrap(self.index), name='index'),
  14. url(r'^login/$', self.login, name='login'),
  15. url(r'^logout/$', wrap(self.logout), name='logout'),
  16. ]
  17.  
  18. # Add in each model's views, and create a list of valid URLS for the
  19. # app_index
  20. valid_app_labels = []
  21. for model, model_admin in six.iteritems(self._registry):
  22.  
  23. urlpatterns += [
  24. url(r'^%s/%s/' % (model._meta.app_label, model._meta.model_name), include(model_admin.urls)),
  25. ]
  26. if model._meta.app_label not in valid_app_labels:
  27. valid_app_labels.append(model._meta.app_label)
  28.  
  29. # If there were ModelAdmins registered, we should have a list of app
  30. # labels for which we need to allow access to the app_index view,
  31. if valid_app_labels:
  32. regex = r'^(?P<app_label>' + '|'.join(valid_app_labels) + ')/$'
  33. urlpatterns += [
  34. url(regex, wrap(self.app_index), name='app_list'),
  35. ]
  36. return urlpatterns
  37.  
  38. @property
  39. def urls(self):
  40. return self.get_urls(), 'admin', self.name

Django之admin的使用及源码分析的更多相关文章

  1. Django rest framework 的认证流程(源码分析)

    一.基本流程举例: urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^users/', views.HostView.as_view() ...

  2. django Rest Framework----APIView 执行流程 APIView 源码分析

    在django—CBV源码分析中,我们是分析的from django.views import View下的执行流程,这篇博客我们介绍django Rest Framework下的APIView的源码 ...

  3. Django框架(十七)-- CBV源码分析、restful规范、restframework框架

    一.CBV源码分析 1.url层的使用CBV from app01 import views url(r'book/',views.Book.as_view) 2.as_view方法 as_view是 ...

  4. Django(44)drf序列化源码分析(1)

    序列化与反序列化   一般后端数据返回给前端的数据格式都是json格式,简单易懂,但是我们使用的语言本身并不是json格式,像我们使用的Python如果直接返回给前端,前端用的javascript语言 ...

  5. Django(63)drf权限源码分析与自定义权限

    前言 上一篇我们分析了认证的源码,一个请求认证通过以后,第二步就是查看权限了,drf默认是允许所有用户访问 权限源码分析 源码入口:APIView.py文件下的initial方法下的check_per ...

  6. Django(64)频率认证源码分析与自定义频率认证

    前言 有时候我们发送手机验证码,会发现1分钟只能发送1次,这是做了频率限制,限制的时间次数,都由开发者自己决定 频率认证源码分析 def check_throttles(self, request): ...

  7. Django day24 cbv和APIView的源码分析 和 resful的规范

    一:cbv的源码分析 1.CBV和FBV的区别: - Class Base View   CBV(基于类的视图) - Function Base View   FBV(基于函数的视图) 2.as_vi ...

  8. Django的rest_framework的分页组件源码分析

    前言: 分页大家应该都很清楚,今天我来给大家做一下Django的rest_framework的分页组件的分析:我的讲解的思路是这样的,分别使用APIview的视图类和基于ModelViewSet的视图 ...

  9. Django rest framework 限制访问频率(源码分析)

    基于 http://www.cnblogs.com/ctztake/p/8419059.html 当用发出请求时 首先执行dispatch函数,当执行当第二部时: #2.处理版本信息 处理认证信息 处 ...

随机推荐

  1. call,apply,bind与es6的数组扩展运算符...

    js中每一个Function对象都有一个apply个一个call方法: function.apply(thisObj,[argArray]); function.call(thisObj,arg1,a ...

  2. CF-799A

    A. Carrot Cakes time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  3. 一、使用 BeautifulSoup抓取网页信息信息

    一.解析网页信息 from bs4 import BeautifulSoup with open('C:/Users/michael/Desktop/Plan-for-combating-master ...

  4. 洛谷 - P2278 - 操作系统 - 模拟

    https://www.luogu.org/problemnew/show/P2278 题目没有说同时到达的优先级最大的应该处理谁. 讲道理就是处理优先级最大的. #include<bits/s ...

  5. 删除链表中的倒数第n个元素

    示例: 输入链表:1->2->3->4->5 , 2 输出:1->2->3->5 Python解决方案1: # Definition for singly-l ...

  6. jpa使用原生SQL查询数据库like的用法

    jpa使用like查询,需要拼接字符串,如下 oracle用法: //dao层代码 @Query(value = "SELECT * FROM TABLENAME WHERE USER_NA ...

  7. MySql 5.6 遇到的一些问题

    1. 卸载5.5之后,使用 mysql installer 时,没法设定 data directory .  最后再次删除mysql installer之后,使系统干净后才能重新安装, 然后界面出现了 ...

  8. MySQL索引的学习

    MySQL索引的学习 关于使用mysql索引的好处,合理的设计并使用mysql索引能够有效地提高查询效率.对于没有索引的表,单表查询可能几十万数据就是平静,在大型网站单日可能会产生几十万甚至几百万的数 ...

  9. Linux权限相关

    权限分组 用户:文件所有者 用户组:多个用户的集合 其他:除了用户和用户组之外的任何用户 权限类别 r:表示读的权限 w:表示写的权限 x:表示执行的权限 s:表示setuid权限,允许用户以其拥有者 ...

  10. Map集合的四种常用遍历方式整理

    1.Map集合简介:map集合是一个key—value型的数据结构,存储的数据具有查询速度快速的特点,但由于是无序的,所以没有顺序可言.在遍历时没有办法像简单的list或数组一样. 2.代码: pac ...