首页 > 技术文章 > admin组件详解

songxuexiang 2018-09-07 10:44 原文

admin组件详解

先根据admin组件启动流程复习下django项目启动至请求过来发生的事

1将admin组件注册进app
2django项目启动
3在运行到定制的admin时执行其下面的apps文件中类下面ready函数在项目启动时就执行每个app下面的admin文件
4当用户发送请求进来首先经过wsgi处理
5再运行中间件中的各个组件对请求进行处理
6在url中找到对应的视图函数并执行返回一个response对象
7返回对象再经过中间件处理(此时执行顺序是从后往前)

流程

知识点

1、django admin利用的是python独有的单例模式来调用的再python中每一个py文件的执行都会生成一个pyc的文件,当下次再调用时,并不会在执行一次py文件, 而是拿到先前生pyc文件的空间中的数据。


2、 改写方法指定app启动时,执行每个app目录下的stark文件

def ready(self):
    autodiscover_modules('stark')

  

3通过查看源码admin中的注册方法通过site调用,site即一个文件类中产生的单例对象,新建文件定义一个生成site对象的方法,定义register方法

class StarkSite(object):
  def __init__(self, name='admin'):
    self._registry = {} #记录注册的model类
  def register(self, model, admin_class=None, **options):
    if not admin_class:
    admin_class = ModelStark # 配置类
    self._registry[model] = admin_class(model)

  

4model注册进此时应该生成对应的url,每张表都应该有自己独有的url,url对应着表中数据的增删改查,那么设计url尤为重要,此时我们采用url分发的方法,一级路由由表名进行命名,二级路由另外写个类,用来调用(因为site是单例,如果写在一个类里面,则每个url都需要生成4个url,代码重复,应该在用户访问某张表的时候生成对应的增删改查路由)

#一级路由代码
def get_urls(self):
 
    temp = []
 
 
    for model_class, config_obj in self._registry.items():
        print("===>", model_class, config_obj)
 
        model_name = model_class._meta.model_name
        app_label = model_class._meta.app_label
        print("===>", app_label, model_name)
 
        temp.append(url(r'^%s/%s/' % (app_label, model_name),config_obj.urls))                

  

5、config_obj是配置类对象,二级路由放入配置类中,在用户注册时,如果有自己的配置类则用自己的 ,没有则用默认的 

def get_urls(self):
 
 
    temp=[
        url("^$",self.list_view,name="%s_%s_list"%(self.app_model_name)),
        url("^add/$",self.add_view,name="%s_%s_add"%(self.app_model_name)),
        url("^(\d+)/change/$",self.change_view,name="%s_%s_change"%            (self.app_model_name)),
        url("^(\d+)/delete/$",self.delete_view,name="%s_%s_delete"%(self.app_model_name)),
 
]
 
        temp.extend(self.extra_urls())
 
        return temp

@property                               #此装饰器的作用是让方法变成可以像属性一样调用
def urls(self):
     return self.get_urls(),None,None

6在装饰类下定义增删改查4个视图方法

Alt text

流程图

>

Alt text

至于增删改查视图中的方法就步过介绍了,自定义admin组件的基本逻辑就是这样

推荐阅读