1.  
  1. admin.site.register(models.UserInfo)
    admin.site.register(models.Book,Book_admin)
    ######当下面注册的这个表里面没有这个方法的时候,就是register后面没有这个admin的话,那么这个就默认会使用Modeladmin的方法
  1. print(self_admin.site._register)##拿到所有的表的类对象,调用的是AdminSite里面的_register,里面封装了全部的(包括自己默认加的两个表[类对象])表
  1. app_name=model._meta.app_label拿到这个类对象(表)的app名字
    model_name=model._meta.model_name拿到这个表下面的所有字段
  1. admin里面的所有的自定制:
  1. list_display = ('__str__',)
    list_display_links = ()
    list_filter = ()
    list_select_related = False
    list_per_page = 100
    list_max_show_all = 200
    list_editable = ()
    search_fields = ()
    date_hierarchy = None
    save_as = False
    save_as_continue = True
    save_on_top = False
    paginator = Paginator
    preserve_filters = True
    inlines = []
  2.  
  3. # Custom templates (designed to be over-ridden in subclasses)
    add_form_template = None
    change_form_template = None
    change_list_template = None
    delete_confirmation_template = None
    delete_selected_confirmation_template = None
    object_history_template = None
    popup_response_template = None
  4.  
  5. # Actions
    actions = []
    action_form = helpers.ActionForm
    actions_on_top = True
    actions_on_bottom = False
    actions_selection_counter = True
    checks_class = ModelAdminChecks
  1.  
  2. 自定制字段原理实现:(函数)
  1. from django.utils.safestring import mark_safe
  1. class Book_admin(admin.ModelAdmin):
    ##自定制字段action,放在list_display里面进行渲染出来
    def action(self):
    ##这传入的self相对应的表的类对象
    return mark_safe('<a href="#">删除</a>')
    list_display = ['num_user','user','room_name','time',action]
    '''
    讲解一下这个原理:
    上面的这个函数的自定义字段的操作,是在modeladmin里面实际是这样来判断下面的list_display是字段,还是函数
    当是函数,就拿这个返回值,拿到这个html在渲染出来(用模板语言)在后端进行的渲染,在浏览器里面解析出相对应的页面出来
    当这个是字段的话,就是某一个表里面的字段,
    实现代码:
    tmp=[]
    a=self.model.objects.all()
    ##这个slef.model是表对象,就是Book
    for model_obj in a:
    for field in list_display:
    if callback(field):
    print("是函数")
    val=field(model_obj)
    #这是进行的实例化操作,拿到这个返回的值,在浏览器解出来(在前端渲染出来)
    tmp.appned(val)
    else:
    print('是字段')
    val=field
    tmp.append(val)
  2.  
  3. ##在前端for循环一下,拿到所有的包括自定制的字段
  4.  
  5. {%for i in dic%}
    <a>{{i}}</a>
    {%endfor%}
    '''
  1.  
  1. 原理讲解:
    不管下面你注册的是表后面有没有自定义的admin样式的时候,都存在注册的表的样式的类
    当你没有配置这个样式的时候,就使用默认的样式类对象ModelAdmin
    当你自己配置了这个样式的话,就使用你配置的类样式,自己配置的类样式也是继承了Adminadmin,也会执行这个类方法
    '''
  1.  
  2. 自定义admin
  3.  
  4. admin部分
  1. self_admin.site.register(Book, book_admin)
    self_admin.site.register(UserInfo)
  2.  
  3. url部分:
  1. from django.conf.urls import url
    from self_admin.server.self_admin import site
  1. ##所有的程序执行起来都是一个单例对象,一直都是一个程序在执行,只有第一个app是调用了site单例对象(modeladmin)
    urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'^self_admin/',site.urls),
    url(r'^login',views.login),
    url(r'^index/',views.index),
    ]
  2.  
  3. self-admin部分:
  1. from django.shortcuts import render,redirect,HttpResponse
    from django.conf.urls import url
  2.  
  3. class Self_Modeladmin(object):
    def __init__(self,model,site):
    self.model=model
    self.site=site
    print('Self_Modeladmin'*1000)
    ##########<class 'app01.models.Room'>
    print(model)
    print('*'*200)
    def add(self,request):
    print(self)
    return HttpResponse(self.model._meta.model_name)
  4.  
  5. def list(self,request):
  6.  
  7. return HttpResponse(self.model._meta.app_label)
  8.  
  9. def change(self,request,id):
  10.  
  11. return HttpResponse(self.model._meta.app_label)
  12.  
  13. ##通过传参数进来调用的时候,不用在加参数进来了,否则会重复
    def delete(self,request,id):
  14.  
  15. return HttpResponse(self.model._meta.app_label)
  16.  
  17. ###########进行增删改查操作
    '''
    讲解:
    当是加静态方法进行调用的时候,没有传一个参数进来,当没有加这个静态方法的时候,你会传参数进来,所以就可以在add函数
    里面少传一个参数进来,注意区别
    '''
    @property
    def get_url3(self):
    dic=[]
    ##类下面的每一个实例对象都有一块独立的内存空间,这个增删改查是独立开来的
    dic.append(url(r'^(\d+)/delete/',self.delete))
    dic.append(url(r'^(\d+)/change/',self.change))
    dic.append(url(r'^add/',self.add))
    dic.append(url(r'^list/',self.list))
    return dic,None,None
  18.  
  19. class Self_AdminSite():
    def __init__(self):
    self._register={}
  20.  
  21. ###这里面传入两个参数,后面的这个参数可以为空,后面的自定义的类可以为空,当为空的时候,就使用默认的modeladmin
    def register(self,model,stark_class=None):
    if not stark_class:
  22.  
  23. #####假如没有自定义的类的话,就用父类样式
    stark_class=Self_Modeladmin
    self._register[model]=stark_class(model,self)#在这里已经传了两个参数进去,在了一个了里面可以直接进行调用
    ##注明一下,后面的这个模型类对象是有参数的(adminbook(book))这个是有传参数过去的 self.model=book这个是可以直接去取这个里面的数据的
  24.  
  25. @property
    def get_urls(self):
    dic = []
    #注明一下,这个第一个是model表,第二个是自定义的类,字典里面有这两个值
    for model,admin_class in self._register.items():
    app_name=model._meta.app_label
    model_name=model._meta.model_name##这个是字段的名字
    # dic.append(url(r'^%s/%s/'%(app_name,model_name),(admin_class.get_url2,None,None)))
    #在下面注明,当这个model有自定义部分的时候,这就是这个于自定义的类,当没有自定义的时候,这个就是默认的继承的父类的部分,样式(部分)
    dic.append(url(r'^%s/%s/'%(app_name,model_name),admin_class.get_url3))
  26.  
  27. #上面的两种方法是一样的,这个之前调用的都是同一个类进行的调用
  28.  
  29. # dic.append(url(r'^%s/%s/'%(app_name,model_name),
    # ([ url(r'^delete', slef_Modeladmin.list)],None,None
    # )))
  30.  
  31. return dic
  32.  
  33. @property
    def urls(self):
  34.  
  35. return self.get_urls,None,None
    site=Self_AdminSite()
  36.  
  37. #创建一个单例对象site
  38.  
  1.  
  1.  

自定义admin(self_admin)的更多相关文章

  1. 自定义admin管理工具(stark组件)

    自定义admin管理工具(stark组件) 创建项目 了解了admin的功能后,我们可以开始仿照admin编写我们自己的管理工具stark组件 首先创建一个新的项目,并创建三个app stark就是我 ...

  2. 自定义admin

    平时我们用的django自带admin,怎么评价呢?一个字简陋,而且也人性化,如下图,首先只显示数据对象,如果要查看详细还有点进去,其次不能对自己想要的数据进行刷选 我们的期望是:数据如excel显示 ...

  3. Django 中自定义 Admin 样式与功能

    目录 自定义 Admin 样式与功能 1 页面修改中文 1.1 语言设置为中文 1.2 应用管理设置为中文 1.3 数据库表设置为中文 1.4 数据库表字段名称修改为中文 2 修改后台样式 2.1 安 ...

  4. Part 7:自定义admin站点--Django从入门到精通系列教程

    该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ...

  5. 自定义admin组件

    配置路由 1 新建一个项目, 创建一个app01和stark应用,stark创建一个service包,并在service下创建stark.py.然后注册app 2 仿照site.py的注册代码,写st ...

  6. django自定义Admin actions

    通常情况下,admin的工作模式是“选中目标,然后修改目标”,但在同时修改大量目标的时候,这种模式就变得重复.繁琐. 为此,admin提供了自定义功能函数actions的手段,可以批量对数据进行修改. ...

  7. Django 自定义 admin

    为 model 自定义显示 label是这个Field如果在form中的话会显示的.而verbose_name在form中不会显示.只是作为一种说明而已 callable()   -->  是否 ...

  8. 第一个Django应用 - 第七部分:自定义admin

    Django的admin站点是自动生成的.高度可定制的,它是Django相较其它Web框架独有的内容,广受欢迎.如果你觉得它不够美观,还有第三方美化版xadmin.请一定不要忽略它,相信我,它值得拥有 ...

  9. 第五章:Admin管理后台 - 2:自定义Admin actions

    通常情况下,admin的工作模式是"选中目标,然后修改目标",但在同时修改大量目标的时候,这种模式就变得重复.繁琐. 为此,admin提供了自定义功能函数actions的手段,可以 ...

随机推荐

  1. Error:Failed to resolve: com.android.support:recyclerview-v7:26.1.0

    修改gradle allprojects { repositories { maven { url "https://maven.google.com" } jcenter() } ...

  2. 解决 Entity Framework 6.0 decimal 类型精度问题

    Ø  前言 本文主要解决 EF 中对于 MSSQL 数据库的 decimal 类型经度问题,经实验该问题仅在 CodeFirst 模式的情况下发生,话不多说直接看代码. 1.   假设我们有一张 Cu ...

  3. 【转】Parcelable, Serializable,Cloneable,copyProperties

    Copying ... https://blog.csdn.net/max2005/article/details/78325036 存在着三件事,整理如下 Parcelable, Serializa ...

  4. springboot08-jpa-mysql

    1.主要pom依赖: <!--jpa--> <dependency> <groupId>org.springframework.boot</groupId&g ...

  5. 隐马尔可夫模型HMM(二)概率计算问题

    摘自 1.李航的<统计学习方法> 2.http://www.cnblogs.com/pinard/p/6955871.html 一.概率计算问题 上一篇介绍了概率计算问题是给定了λ(A,B ...

  6. nginx 相关命令

    验证配置是否正确: nginx -t 查看Nginx的版本号:nginx -V 启动Nginx:start nginx 快速停止或关闭Nginx:nginx -s stop 正常停止或关闭Nginx: ...

  7. Linux之文件恢复[extundelete,针对rm]

    [恢复过程] 1.下载+安装extundelete cd /tmp wget wget http://jaist.dl.sourceforge.net/project/extundelete/extu ...

  8. ArrayQueue的底层实现

    package zy813ture; public class MyArrayQueue1 {//双向循环数组 private Object []obj; private int front; pri ...

  9. Hive思维导图

  10. python的sys.args使用

    一.sys 模块 sys是Python的一个「标准库」,也就是官方出的「模块」,是「System」的简写,封装了一些系统的信息和接口. 官方的文档参考:https://docs.python.org/ ...