admin模块:
admin提供了5种接口
list_display,
list_display_link,哪个字段可以链接
search_fields,搜索框
list_filter:用于筛选
acition:批处理
1.首先Django启动会自动加载配置文件
通过autodiscover_modules('文件名')会自动执行每一个应用下的文件
那么创建一个名为stark的应用(模拟admin的应用)和一个名为app01,app02的应用(正常测试应用)
在app01和app02下创建stark.py文件
在setting中为app01,app02,stark注册
点进StarkConfig
模仿admin,在StarkConfig中加入autodiscover_modules
测试一下,在app01,app02下的stark.py文件中,打印字符串
启动Django,运行效果:
这样我们就实现了启动Django的时候就运行我们自己定义的文件了
第一次打印是debug模式,不用管
2.路由分发
看看admin是怎么做的路由分发
点击site,如下图所示,site是一个类的实例化对象,同样这也是基于模板的单例
那么site.urls是什么?
没错,urls就是AdminSite这个类中有property装饰的一个类而已,@property简单的来说就是外界可以通过点(.)的方式来获取这个函数的返回值,可以当做类的变量来处理
那么看看urls返回了什么
它返回了一个元组
这也是路由分发的根本原理
先说一下路由分发的本质:
路由分发的基本格式:url('正则表达式',([分发的路由],None,None))
一级分发:此时生成了两条路由
二级分发:此时生成了四条路由
通过这样的原理,可以无限的分发,三级分发,四级分发等等
现在在看这句源码:
和基础格式([ ],None,None)是不是对应了起来,那么我们猜测self.get_urls()返回的是一个列表
检验一下:
def get_urls(self): from django.conf.urls import url, include # Since this module gets imported in the application's root package, # it cannot import models from other applications at the module level, # and django.contrib.contenttypes.views imports ContentType. from django.contrib.contenttypes import views as contenttype_views def wrap(view, cacheable=False): def wrapper(*args, **kwargs): return self.admin_view(view, cacheable)(*args, **kwargs) wrapper.admin_site = self return update_wrapper(wrapper, view) # Admin-site-wide views. urlpatterns = [ url(r'^$', wrap(self.index), name='index'), url(r'^login/$', self.login, name='login'), url(r'^logout/$', wrap(self.logout), name='logout'), url(r'^password_change/$', wrap(self.password_change, cacheable=True), name='password_change'), url(r'^password_change/done/$', wrap(self.password_change_done, cacheable=True), name='password_change_done'), url(r'^jsi18n/$', wrap(self.i18n_javascript, cacheable=True), name='jsi18n'), url(r'^r/(?P<content_type_id>\d+)/(?P<object_id>.+)/$', wrap(contenttype_views.shortcut), name='view_on_site'), ] # 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) # If there were ModelAdmins registered, we should have a list of app # labels for which we need to allow access to the app_index view, if valid_app_labels: regex = r'^(?P<app_label>' + '|'.join(valid_app_labels) + ')/$' urlpatterns += [ url(regex, wrap(self.app_index), name='app_list'), ] return urlpatterns