本文详细介绍了xadmin的路由系统和我们常见的类视图(比如List、Create、Retrieve、Update类视图)的动态生成过程。
1、django会通过总路由中的来注册xadmin所有的视图函数。
2、xadmin.sites.urls里面发生了什么呢?
xadmin.sites.urls中的urls函数中调用site. get_urls()
3、get_urls()会先遍历self._registry_views然后将url添加到urlpatterns中,并将xurlpatterns返回给django总路由
4、self._registry_views是哪里来的呢?通过sites.registry_view函数添加的。
而registry_view函数就在xadmin.views.__init__.py中被调用了。
5、get_urls()还会遍历self._registry,将url添加到urlpatterns
self._registry是哪里来的呢?通过sites.registry函数添加的
而registry函数在哪里被调用的呢?就是在你注册模型的admin管理类时。
装饰器注册:
函数注册:
6、url都注册完成了,那么类视图是在什么时候被创建的呢
就是在get_urls()遍历self._registry_views和self._registry生成urlpatterns时,
就是这两个标注的函数创建的
点进去看下,先通过get_view_class函数获得类视图名字,然后通过as_view注册:
在详细看下get_view_class这个方法里面,它将很多内容拼接到一起组成了最终的类视图名字new_class_name,
这个类视图具有的属性和方法就不在深入探究了(其实也在这个方法中实现的),然后将这个类视图添加到了
sites. AdminSite._admin_view_cache类属性中。
7、最后我们再来看下_admin_view_cache这个类属性,也是所有的类视图,我只截取部分:
前面是xadmin自动生成的类视图,例如password相关的、login/logout相关的等等
Departments是我自己写的模型,有看到create、list、edit、delete等相关的类视图了吧。
8、最后的最后,随便看其中一个类视图,以DepartmentsList类视图为例: