zoukankan      html  css  js  c++  java
  • 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() 删除
  • 相关阅读:
    Web中的通配符
    EJB版本
    package-info.java
    dynamic web module version
    深入解析和反思携程宕机事件
    Ubuntu 环境下使用cronolog 切割Tomcat日志
    ubuntu环境下cassandra安装配置
    zabbix自定义触发器语法
    zabbix系统邮件告警Python脚本
    Ubuntu14.04下zabbix2.4.5 源码编译安装
  • 原文地址:https://www.cnblogs.com/78pikaqiu/p/7709966.html
Copyright © 2011-2022 走看看