• python2.0_day18_django_admin


    Django admin的个性化定制
    首先我们看下,前面章节中定义的models在admin后台管理界面的样子:

       

    然后我们看下老男孩教育点名平台的admin管理表的后台界面样子:


    admin管理后台常用的就是上面操作的这几种吧,我们来看下如何实现?

    首先我们知道,使用admin后台管理表,需要将表注册到admins.py文件中:
    1     from django.contrib import admin
    2     # Register your models here.
    3     from app01 import models
    4     admin.site.register(models.Author)    # 注册进来
    5     admin.site.register(models.Book)      # 注册进来
    6     admin.site.register(models.Publisher)

    这样就简单实现了图一中的管理界面.
    配置成图2中的显示多个字段的管理界面其实也很简单,在admins.py配置文件两步实现:
    1.创建一个管理表单的admin类
    2.将这个admin类在注册表的时候关联起来.

    class BookAdmin(admin.ModelAdmin):
            list_display = ('title','publisher','publication_date')  #指定显示的字段
    
        admin.site.register(models.Author)
        admin.site.register(models.Book,BookAdmin)  # 注册的时候,把定义的BookAdmin类作为参数传入进来
        admin.site.register(models.Publisher)

    保存后,访问http://127.0.0.1:8000/admin/app01/book/
    结果如下:

    这里我们有一点关于显示Book表中定义的关于manytomany关系表的显示.
    Django admin后台管理是不支持显示这种many_to_many关系的,如果你配置了,
    1 class BookAdmin(admin.ModelAdmin):
    2         list_display = ('title','authors','publisher','publication_date')  #指定显示的字段
        访问时会报如下错误:
    1     <class 'app01.admin.BookAdmin'>: (admin.E109) The value of 'list_display[1]' must not be a ManyToManyField.
        为什么呢?
    因为一行显示不了多个作者.并且这样显示,效率非常底,因为它要另外一张表一个一个查找出来.多一次查询.

    了解了怎么实现个性化定制admin的方法.下面我们定义其他想图2中的配置.
     1 from django.contrib import admin
     2 
     3 # Register your models here.
     4 from app01 import models
     5 
     6 class BookAdmin(admin.ModelAdmin):
     7     list_display = ('id','title','publisher','publication_date')  #指定显示的字段
     8     search_fields = ('title','publisher__name') #添加搜索字段
     9     # 这里我们定义了两个可以提供搜寻的字段 Book.title 和一个外键表.name
    10     # 我们知道外键关联的是另外一个orm类,如果你想在本张表中通过搜索关联表字段来做帅选,是不是要搜外间表.Django admin里使用publisher__字段名 的方式实现了让你在当前表搜外键表的功能
    11     list_filter = ('publisher','publication_date') # 添加按照字段过滤的关键字list_filter
    12     # 这里外键就可以直接写字段了.
    13     list_editable = ('title','publisher','publication_date')  #让后台界面上可以直接修改字段值的关键字定义list_editable
    14     #这里注意Django admin后台默认显示的第一个表字段是不能修改的.
    15     list_per_page = 10 # 让每页显示几条记录的设置
    16 
    17     filter_horizontal = ('authors',)  #只针对多对多
    18     raw_id_fields = ('publisher',)    # 只针对外键的
    19 
    20 
    21 
    22 admin.site.register(models.Author)
    23 admin.site.register(models.Book,BookAdmin)  # 注册的时候,把定义的BookAdmin类作为参数传入进来
    24 admin.site.register(models.Publisher)
    首页里显示的东西差不多就这些定制.
    访问页面看下效果:
    接下来就是点到条目内的个性化定制
    filter_horizontal = ('authors',) #只针对多对多
    raw_id_fields = ('publisher',) # 只针对外键的
    我们看下效果:

       


    Django的后台管理只适用内容管理,像监控平台这种不能用admin后台管理!!

    Admin Actions
    配置admin后台的Admin Actions 来进行批量操作.
    假如,Book有一个状态:已出版待出版禁书
    首先我们先给models.py文件中的Book 类,加一个字段为status,并且这个字段的值只能选择3个状态中的一个
     1 class Book(models.Model):
     2     title = models.CharField(max_length=100)
     3     authors = models.ManyToManyField(Author)
     4     publisher = models.ForeignKey(Publisher)
     5     publication_date = models.DateField()
     6 
     7     # 添加状态的选择范围,用户在创建的时候只能从这里选择三个状态
     8     status_choices = (('published',u"已出版"),
     9                       ('producing',u"待出版"),
    10                       ('forbidden',u"禁书"),
    11 
    12                     )
    13     # 前面定义了选项,这里要创建一个字段用到前面的选项
    14     status = models.CharField(choices=status_choices,max_length=32)
    15     def __str__(self):
    16         return "<%s>"%(self.title)

    我们完成上面的更改后,在执行同步数据库的操作.这里会碰到一个问题,因为我们是给一个已存在的表添加字段,那么添加之前的记录都没有这个字段,我们添加字段的时候,就要给一个默认值.
    如果不给我们在使用命令生成配置文件也会提示我们,让我们设置一个.如:
    1     $ python3.5 manage.py  makemigrations
    2     You are trying to add a non-nullable field 'status' to book without a default; we can't do that (the database needs something to populate existing rows).
    3     Please select a fix:
    4      1) Provide a one-off default now (will be set on all existing rows)
    5      2) Quit, and let me add a default in models.py
    6     Select an option:
    那我们最后是在添加status字段的时候定义.如:
     1 class Book(models.Model):
     2     title = models.CharField(max_length=100)
     3     authors = models.ManyToManyField(Author)
     4     publisher = models.ForeignKey(Publisher)
     5     publication_date = models.DateField()
     6 
     7     # 添加状态的选择范围,用户在创建的时候只能从这里选择三个状态
     8     status_choices = (('published',u"已出版"),
     9                       ('producing',u"待出版"),
    10                       ('forbidden',u"禁书"),
    11 
    12                     )
    13     # 前面定义了选项,这里要创建一个字段用到前面的选项
    14     status = models.CharField(choices=status_choices,max_length=32,default='producing') #这里加一个default属性
    15     def __str__(self):
    16         return "<%s>"%(self.title)
    然后我们在同步数据库,就不会报错了,如:
     1 $ python3.5 manage.py  makemigrations
     2 Migrations for 'app01':
     3   0002_book_status.py:
     4     - Add field status to book
     5 zhoumingdeMacBook-Pro:day18_site tedzhou$ python3.5 manage.py  migrate
     6 Operations to perform:
     7   Apply all migrations: admin, app01, auth, sessions, contenttypes
     8 Running migrations:
     9   Rendering model states... DONE
    10   Applying app01.0002_book_status... OK

    然后让status显示在admin管理后台
     1 class BookAdmin(admin.ModelAdmin):
     2     list_display = ('id','title','publisher','publication_date','status')  #把status加入到显示列表
     3     search_fields = ('title','publisher__name') #添加搜索字段
     4     list_filter = ('publisher','publication_date') # 添加按照字段过滤的关键字list_filter
     5     list_editable = ('title','publisher','publication_date','status')  # 把status加入可编辑列表
     6     list_per_page = 10 # 让每页显示几条记录的设置
     7 
     8     filter_horizontal = ('authors',) #只针对多对多字段
     9     raw_id_fields = ('publisher',)    # 只针对外键的
    10 
    11 
    12 admin.site.register(models.Author)
    13 admin.site.register(models.Book,BookAdmin)  # 注册的时候,把定义的BookAdmin类作为参数传入进来
    14 admin.site.register(models.Publisher)
    这时候我们访问后台http://127.0.0.1:8000/admin/app01/book/?

    然后我们就是如何实现把更高status放到admin Action中,进行批量更改记录了.
    两步:都是在admin.py文件里操作
    1.定义更改字段的函数
    2.在ModelAdmin类里添加actions=[]属性
    代码如下:
     1 def make_forbidden(modelAdmin,request,queryset):  #这里必须是三个参数,modelAdmin指的是调用此函数的modelAdmin的类,queryset指的是我们在后台中选中的记录
     2     print('--->',request,queryset)
     3     queryset.update(status='forbidden')
     4     make_forbidden.short_description = "Set to forbidden"   # 定义在action后台中显示的文本内容
     5 
     6 class BookAdmin(admin.ModelAdmin):
     7     list_display = ('id','title','publisher','publication_date','status')
     8     search_fields = ('title','publisher__name')
     9     list_filter = ('publisher','publication_date')
    10     list_editable = ('title','publisher','publication_date','status')
    11     list_per_page = 10
    12 
    13     filter_horizontal = ('authors',)
    14     raw_id_fields = ('publisher',)
    15     actions = [make_forbidden,] #定义actions属性
    16 admin.site.register(models.Author)
    17 admin.site.register(models.Book,BookAdmin)  # 注册的时候,把定义的BookAdmin类作为参数传入进来
    18 admin.site.register(models.Publisher)
    此时我们就可以批量操作记录了http://127.0.0.1:8000/admin/app01/book/

    ok 添加action的功能就这样实现了。

    django admin 扩展之根据不同的status状态,显示不同颜色
    引入图片010.png
    代码如何显示呢?
    1.首先要在models.py文件里的Book类里写一个函数如下:
     1 class Book(models.Model):
     2     title = models.CharField(max_length=100)
     3     authors = models.ManyToManyField(Author)
     4     publisher = models.ForeignKey(Publisher)
     5     publication_date = models.DateField()
     6 
     7     # 添加状态的选择范围,用户在创建的时候只能从这里选择三个状态
     8     status_choices = (('published',u"已出版"),
     9                       ('producing',u"待出版"),
    10                       ('forbidden',u"禁书"),
    11 
    12                     )
    13     # 前面定义了选项,这里要创建一个字段用到前面的选项
    14     status = models.CharField(choices=status_choices,max_length=32,default='producing')
    15     def __str__(self):
    16         return "<%s>"%(self.title)
    17 
    18     # 新Book类中新定义colored_status方法
    19     def colored_status(self):
    20         if self.status == "published":
    21             # format_td = format_html('<span stype="padding:2px;color:white">已报名</span>')
    22             format_td = '<span stype="padding:2px;background-color:yellowgreen;color:white">已出版</span>'
    23         elif self.status == 'producing':
    24             format_td = '<span stype="padding:2px;background-color:pink;color:white">待出版</span>'
    25         elif self.status == 'forbidden':
    26             format_td = '<span stype="padding:2px;background-color:orange;color:white">禁书</span>'
    27 
    28         return format_td

    2.定义好后,如何在后台中显示该内容呢?在admin里定义的显示列表中直接将此方法加入即可
    1 class BookAdmin(admin.ModelAdmin):
    2     list_display = ('id','title','publisher','publication_date','colored_status','status')  #指定显示的字段
    3.然后我们在浏览器访问http://127.0.0.1:8000/admin/app01/book/
    显示如下


    4.我们看到虽然admin后台中显示新加的字段内容.但是却不是前端的代码,而是一个字符串.这个在Django1.7及以前都是直接解析成前端代码的.而现在我们用的1.9,就需要在models.py文件中定义Book类中方法时调用format_html方法.
    代码如下:
     1 from django.utils.html import format_html  # 引入format_html方法
     2 class Book(models.Model):
     3     title = models.CharField(max_length=100)
     4     authors = models.ManyToManyField(Author)
     5     publisher = models.ForeignKey(Publisher)
     6     publication_date = models.DateField()
     7 
     8     # 添加状态的选择范围,用户在创建的时候只能从这里选择三个状态
     9     status_choices = (('published',u"已出版"),
    10                       ('producing',u"待出版"),
    11                       ('forbidden',u"禁书"),
    12 
    13                     )
    14     # 前面定义了选项,这里要创建一个字段用到前面的选项
    15     status = models.CharField(choices=status_choices,max_length=32,default='producing')
    16     def __str__(self):
    17         return "<%s>"%(self.title)
    18 
    19     def colored_status(self):
    20         if self.status == "published":
    21             format_td = format_html('<span stype="padding:2px;background-color:yellowgreen;color:white">已出版</span>') # 实例化format_html类
    22         elif self.status == 'producing':
    23             format_td = format_html('<span stype="padding:2px;background-color:pink;color:white">待出版</span>')
    24         elif self.status == 'forbidden':
    25             format_td = format_html('<span stype="padding:2px;background-color:orange;color:white">禁书</span>')
    26 
    27         return format_td
    5.再次访问http://127.0.0.1:8000/admin/app01/book/

    
    
  • 相关阅读:
    currentColor
    clip:rect()
    webkitAnimationEnd事件与webkitTransitionEnd事件
    正方体旋转demo
    由-webkit-transform-style:preserve-3d;所想
    设置网站的图标
    条件注释判断浏览器
    怎样动态地插入不会暴露给用户的JS文件
    IOC Unity
    C# 线程
  • 原文地址:https://www.cnblogs.com/zhming26/p/5767158.html
Copyright © 2020-2023  润新知