先根据admin组件启动流程复习下django项目启动至请求过来发生的事python
1将admin组件注册进app
2django项目启动
3在运行到定制的admin时执行其下面的apps文件中类下面ready函数在项目启动时就执行每一个app下面的admin文件
4当用户发送请求进来首先通过wsgi处理
5再运行中间件中的各个组件对请求进行处理
6在url中找到对应的视图函数并执行返回一个response对象
7返回对象再通过中间件处理(此时执行顺序是从后往前)django
知识点app
一、django admin利用的是python独有的单例模式来调用的再python中每个py文件的执行都会生成一个pyc的文件,当下次再调用时,并不会在执行一次py文件, 而是拿到先前生pyc文件的空间中的数据。函数
二、 改写方法指定app启动时,执行每一个app目录下的stark文件url
def ready(self): autodiscover_modules('stark')
3经过查看源码admin中的注册方法经过site调用,site即一个文件类中产生的单例对象,新建文件定义一个生成site对象的方法,定义register方法spa
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))
五、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个视图方法对象
>blog
至于增删改查视图中的方法就步过介绍了,自定义admin组件的基本逻辑就是这样