django之admin源码解析解析admin的源码
第⼀步:项⽬启动,加载settings⽂件中的 INSTALLED_APPS
⾥边有⼏个app就加载⼏个,按照注册顺序来执⾏。
第⼆步:其中加载的是admin.py,加载每⼀个app下的admin.py⽂件
第三步:执⾏代码
第四步:看admin.site⾛的流程
咱⾛⼀下源码
总结⼀下:
第五步:执⾏register⽅法
ister(Book, BookAdmin)
ister(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)
注册就结束了!
django admin 自定义页面补充⼀下:
在每⼀个app的admin .py中加上
print(admin.site._registry) #执⾏结果?
app01:
app02:
第六步:admin的URL配置
urlpatterns = [
url(r'^admin/', admin.site.urls),
]
class AdminSite(object):
def get_urls(self):
f.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._del_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):
_urls(), 'admin', self.name
总结admin源码解析:
1:在Django项⽬启动时,加载settings中的install_apps,扫描每个APP项⽬下的admin.py⽂件的⽂件,创建admin.site中的对象,site = AdminSite(),本质实例化⼀个对象,以后不管谁来调⽤都使⽤这个对象,
执⾏对象的register⽅法,⽬的将注册类添加到_register中,
admin.site是⼀个对象(单例模式创建),其中封装了_register。
2:再次调⽤admin.site的urls属性。
返回了⼀个元组,元组有三个元素,_urls(),'admin ',self.name。
第⼀个元素是⼀个函数返回的是⼀个列表,列表中是url,是循环admin.site中的_register(ruanzhiste),
中的注册类,⽣成url,放在列表中。为每个注册类⽣成⼀级URL,其次调⽤类的样式对象下的get_url_func(self)
函数,⽣成⼆级URL,同时为每⼀个增删改查URL创建别名,⽤于反向解析,每个url对应⼀个视图函数。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论