Django 中 admin 的执行流程

1 循环加载执行所有已经注册的 app 中的 admin.py 文件

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

2 执行代码

#admin.py

class BookAdmin(admin.ModelAdmin):
list_display = ("title",'publishDate', 'price') admin.site.register(Book, BookAdmin) admin.site.register(Publish)

3 admin.site

class AdminSite(object):

    ......

site = AdminSite()

这里应用的是一个单例模式,对于 AdminSite 类的一个单例模式,执行的每一个 app 中的每一个 admin.site 都是一个对象。

4 执行 register 方法

admin.site.register(Book, BookAdmin)
admin.site.register(Publish)
class ModelAdmin(BaseModelAdmin):pass

def register(self, model_or_iterable, admin_class=None, **options):
if not admin_class:
admin_class = ModelAdmin
# Instantiate the admin class to save in the registry
self._registry[model] = admin_class(model, self)

到这里,注册结束!

5 admin 的 URL 配置

urlpatterns = [
url(r'^admin/', admin.site.urls),
]

这里的 urls 其实是一个静态函数,能够返回一个元组,元组的第一个元素是 url 列表,剩下的两个元素是 Django 自配的,自配置时设为 None 即可。urls 函数如下。

class AdminSite(object):

     def get_urls(self):
from django.conf.urls import url, include urlpatterns = [] # Add in each model's views, and create a list of valid URLS for the
# app_index
valid_app_labels = []
for model, model_admin in self._registry.items():
urlpatterns += [
url(r'^%s/%s/' % (model._meta.app_label, model._meta.model_name), include(model_admin.urls)),
]
if model._meta.app_label not in valid_app_labels:
valid_app_labels.append(model._meta.app_label) return urlpatterns @property
def urls(self):
return self.get_urls(), 'admin', self.name

6 url() 方法的扩展应用

from django.shortcuts import HttpResponse
def test01(request):
return HttpResponse("test01") def test02(request):
return HttpResponse("test02") urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^yuan/', ([
url(r'^test01/', test01),
url(r'^test02/', test02), ],None,None)), ]

扩展优化

from django.conf.urls import url,include
from django.contrib import admin from django.shortcuts import HttpResponse def change_list_view(request):
return HttpResponse("change_list_view")
def add_view(request):
return HttpResponse("add_view")
def delete_view(request):
return HttpResponse("delete_view")
def change_view(request):
return HttpResponse("change_view") def get_urls(): temp=[
url(r"^$".format(app_name,model_name),change_list_view),
url(r"^add/$".format(app_name,model_name),add_view),
url(r"^\d+/del/$".format(app_name,model_name),delete_view),
url(r"^\d+/change/$".format(app_name,model_name),change_view),
] return temp url_list=[] for model_class,obj in admin.site._registry.items(): model_name=model_class._meta.model_name
app_name=model_class._meta.app_label # temp=url(r"{0}/{1}/".format(app_name,model_name),(get_urls(),None,None))
temp=url(r"{0}/{1}/".format(app_name,model_name),include(get_urls()))
url_list.append(temp) urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^yuan/', (url_list,None,None)),
]

参考链接:https://www.cnblogs.com/yuanchenqi/articles/8323452.html

Django 中 admin 的执行流程的更多相关文章

  1. shell中命令的执行流程

    在shell中,一个命令有3中写法: 1 可以直接写(Normal Command) 2 可以放在双引号中("Command") 3 可以放在单引号中('Comand') 这3中写 ...

  2. Springmvc中的HandlerAdaptor执行流程

    今天讲解一下在Springmvc中的HandlerAdaptor执行流程,明白这个过程,你就能画出下面的图: 接下来我们就来看看具体的实现过程吧. 1.0在DispatcherServlet中找到ge ...

  3. Django的admin.py注册流程

    通常创建一个Django项目的时候,在Django的配置文件settings.py中,都会有下面的这段配置: INSTALLED_APPS = [ 'django.contrib.admin', 'd ...

  4. Django 中Admin站点的配置

    Admin站点是django提供的一个后台管理页面,可以用来对用户与数据库表数据进行管理. Admin站点配置流程 1.在settings.py文件中INSTALL_APPS列表中添加django.c ...

  5. Django中CBV的执行顺序之源码解析

    浅析Django中的CBV的执行顺序 下图为CBV方式的执行顺序,大概执行流程如下: 其中浅蓝色为在假设自己写的类,即Test类中没有dispatch方法的情况下的执行顺序,当自己的类中有dispat ...

  6. django中admin的使用

    转载网址:https://www.cnblogs.com/wumingxiaoyao/p/6928297.html     Django自带的后台管理是Django明显特色之一,可以让我们快速便捷管理 ...

  7. Django项目启动之前执行流程剖析

    下面,我们只看看主要的步骤: 1.项目启动,遍历settings下面的INSTALLED_APPS,导入默认配置. INSTALLED_APPS = [ 'django.contrib.admin', ...

  8. django中admin一些方法

    1.概述:内容发布,负责添加,修改,删除内容及公告访问2.配置admin应用在settings文件中INSTALLED_APPS添加:'django.contrib.admin', 默认是已经添加好的 ...

  9. 深入理解java中HelloWorld的执行流程

    HelloWorld.java是我们学习java的第一个程序,简单的再也不能简单了,可是里面的原理以及执行流程大家都知道吗?最近在复习java知识,特地钻研了一番分享给大家! 贴出HelloWorld ...

随机推荐

  1. 值得一做》关于数学与递推 BZOJ1002 (BZOJ第一页计划)(normal+)

    什么都不说先甩题目 Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之 ...

  2. POI 生成exel报表

    去官网下载相关jar包   http://poi.apache.org/ package poi.zr.com; import java.io.File; import java.io.FileNot ...

  3. How to Choose the Best Way to Pass Multiple Models in ASP.NET MVC

    Snesh Prajapati, 8 Dec 2014 http://www.codeproject.com/Articles/717941/How-to-Choose-the-Best-Way-to ...

  4. Usage of the @ (at) sign in ASP.NET

    from:http://www.mikesdotnetting.com/article/258/usage-of-the-at-sign-in-asp-net Thursday, January 22 ...

  5. HDU 3365 New Ground (计算几何)

    题意:给定点A[0~n-1]和B[0],B[1],A[0].A[1]映射到B[0].B[1],求出其余点的映射B[2]~B[n-1]. 析:运用复数类,关键是用模板复数类,一直编译不过,我明明能编译过 ...

  6. Deep Residual Learning for Image Recognition

    Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun           Microsoft Research {kahe, v-xiangz, v-sh ...

  7. LibreOJ 6283 数列分块入门 7(区间加区间乘区间求和)

    题解:这道题要打一个乘标记一个加标记,两个标记的优先级是乘法高,所以在乘的时候要将加标记同时乘上一个c,当然,对于每个非完整块一定要记得暴力重构整个块,把加标记和乘标记都初始化. 代码如下: #inc ...

  8. Long-Polling, Websockets, SSE(Server-Sent Event), WebRTC 之间的区别与使用

    1.首先看下最简单的SSE: 只用支持SSE的浏览器(大部分)即可,浏览器内置EventSource对象,该对象默认隔三秒刷新一下response的数据. HTML代码(取自w3cschool): & ...

  9. 【单例模式】Singleton pattern

    前言:有很多时候,在一个生命周期中我们只要一个对象就可以了,比如:线程池,缓存,对话框,日志,显卡驱动等等.如果造出多个实例,就会导致许多问题产生,例如:程序的行为异常.资源使用过量,或者说不一致的结 ...

  10. System.Net.Http

    System.Net.Http DotNet菜园 占个位置^-^ 2018-11-10 09:55:00修改 这个HttpClient的学习笔记一直迟迟未记录,只引用了其他博主的博客链接占个位置,但被 ...