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() 删除

 

posted @ 2017-10-22 15:26  Amos丶G  阅读(164)  评论(0编辑  收藏  举报