Django Admin 本质
Django内置的Admin是对于app中的model数据表数据进行增删改查提供的组件。
一、基本用法
1.配置路由。Django项目中默认已经配置:
from django.conf.urls import url from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), ]
2.注册model:
from django.contrib import admin from . import models admin.site.register(models.UserInfo)
3.通过查看admin源码我们知道,admin会自动创建路由映射关系(url),格式如下:
/admin/app名称/model名称/ 列表 /admin/app名称/model名称/add/ 增加 /admin/app名称/model名称/ID值/change/ 修改 /admin/app名称/model名称/ID值/delete/ 删除
......
二、定制Admin
通过将model 注册admin.site.register(models.UserInfo),可以提供基本后台管理的功能。通过查看源码,我们还知道register()函数默认还接收了第二个参数:ModelAdmin,它是一个配置类,实例化时接收model和site 对象,为给定model封装所有管理员选项和功能。因此通过继承ModelAdmin类,即可自定义个性化Admin:
from django.contrib import admin from . import models # 方式一: class MyConfig(admin.ModelAdmin): # 自定义显示字段 list_display = ['id', 'name', 'email'] admin.site.register(models.UserInfo, MyConfig) # 方式二: @admin.register(models.UserInfo) class MyConfig(admin.ModelAdmin): list_display = ['id', 'name', 'email']
自定义选项参见:http://www.cnblogs.com/wupeiqi/articles/7444717.html
三、Admin路由系统的本质
1.加载setting.py配置
INSTALLED_APPS = [ 'django.contrib.admin', # ....... ]
2.寻找admin模块,django.contrib.admin
的__init__.py
中:
def autodiscover(): autodiscover_modules('admin', register_to=site)
说明:Django会自动去所有应用中寻找admin.py模块,并执行
3.执行admin.py,注册model:
from django.contrib import admin from . import models admin.site.register(models.UserInfo)
4.admin.site.register()中为site对象的_registry字典赋值,key是model,value是model 的配置类
self._registry[model] = admin_class(model, self)
5.执行路由映射关系
url(r'^admin/', admin.site.urls)
再次调用site对象下的urls方法,循环site的_registry属性,根据app和model名称,生成Django后台管理的url映射。
6.我们在Django后台中执行的增删改查,其实就是执行了ModelAdmin中的以下方法:
def changelist_view() 显示列表 def add_view()增加 def change_view() 修改 def delete_view() 删除