python2.0_day18_django_admin
Django admin的个性化定制
首先我们看下,前面章节中定义的models在admin后台管理界面的样子:
然后我们看下老男孩教育点名平台的admin管理表的后台界面样子:
admin管理后台常用的就是上面操作的这几种吧,我们来看下如何实现? 首先我们知道,使用admin后台管理表,需要将表注册到admins.py文件中:
from django.contrib import admin
# Register your models here.
from app01 import models
admin.site.register(models.Author) # 注册进来
admin.site.register(models.Book) # 注册进来
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关系的,如果你配置了,
class BookAdmin(admin.ModelAdmin):
list_display = ('title','authors','publisher','publication_date') #指定显示的字段
访问时会报如下错误:
<class 'app01.admin.BookAdmin'>: (admin.E109) The value of 'list_display[1]' must not be a ManyToManyField.
为什么呢?
因为一行显示不了多个作者.并且这样显示,效率非常底,因为它要另外一张表一个一个查找出来.多一次查询. 了解了怎么实现个性化定制admin的方法.下面我们定义其他想图2中的配置.
from django.contrib import admin # Register your models here.
from app01 import models class BookAdmin(admin.ModelAdmin):
list_display = ('id','title','publisher','publication_date') #指定显示的字段
search_fields = ('title','publisher__name') #添加搜索字段
# 这里我们定义了两个可以提供搜寻的字段 Book.title 和一个外键表.name
# 我们知道外键关联的是另外一个orm类,如果你想在本张表中通过搜索关联表字段来做帅选,是不是要搜外间表.Django admin里使用publisher__字段名 的方式实现了让你在当前表搜外键表的功能
list_filter = ('publisher','publication_date') # 添加按照字段过滤的关键字list_filter
# 这里外键就可以直接写字段了.
list_editable = ('title','publisher','publication_date') #让后台界面上可以直接修改字段值的关键字定义list_editable
#这里注意Django admin后台默认显示的第一个表字段是不能修改的.
list_per_page = # 让每页显示几条记录的设置 filter_horizontal = ('authors',) #只针对多对多
raw_id_fields = ('publisher',) # 只针对外键的 admin.site.register(models.Author)
admin.site.register(models.Book,BookAdmin) # 注册的时候,把定义的BookAdmin类作为参数传入进来
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个状态中的一个
class Book(models.Model):
title = models.CharField(max_length=)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField() # 添加状态的选择范围,用户在创建的时候只能从这里选择三个状态
status_choices = (('published',u"已出版"),
('producing',u"待出版"),
('forbidden',u"禁书"), )
# 前面定义了选项,这里要创建一个字段用到前面的选项
status = models.CharField(choices=status_choices,max_length=)
def __str__(self):
return "<%s>"%(self.title)
我们完成上面的更改后,在执行同步数据库的操作.这里会碰到一个问题,因为我们是给一个已存在的表添加字段,那么添加之前的记录都没有这个字段,我们添加字段的时候,就要给一个默认值.
如果不给我们在使用命令生成配置文件也会提示我们,让我们设置一个.如:
$ python3. manage.py makemigrations
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).
Please select a fix:
) Provide a one-off default now (will be set on all existing rows)
) Quit, and let me add a default in models.py
Select an option:
那我们最后是在添加status字段的时候定义.如:
class Book(models.Model):
title = models.CharField(max_length=)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField() # 添加状态的选择范围,用户在创建的时候只能从这里选择三个状态
status_choices = (('published',u"已出版"),
('producing',u"待出版"),
('forbidden',u"禁书"), )
# 前面定义了选项,这里要创建一个字段用到前面的选项
status = models.CharField(choices=status_choices,max_length=,default='producing') #这里加一个default属性
def __str__(self):
return "<%s>"%(self.title)
然后我们在同步数据库,就不会报错了,如:
$ python3. manage.py makemigrations
Migrations for 'app01':
0002_book_status.py:
- Add field status to book
zhoumingdeMacBook-Pro:day18_site tedzhou$ python3. manage.py migrate
Operations to perform:
Apply all migrations: admin, app01, auth, sessions, contenttypes
Running migrations:
Rendering model states... DONE
Applying app01.0002_book_status... OK
然后让status显示在admin管理后台
class BookAdmin(admin.ModelAdmin):
list_display = ('id','title','publisher','publication_date','status') #把status加入到显示列表
search_fields = ('title','publisher__name') #添加搜索字段
list_filter = ('publisher','publication_date') # 添加按照字段过滤的关键字list_filter
list_editable = ('title','publisher','publication_date','status') # 把status加入可编辑列表
list_per_page = # 让每页显示几条记录的设置 filter_horizontal = ('authors',) #只针对多对多字段
raw_id_fields = ('publisher',) # 只针对外键的 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/?
然后我们就是如何实现把更高status放到admin Action中,进行批量更改记录了.
两步:都是在admin.py文件里操作
1.定义更改字段的函数
2.在ModelAdmin类里添加actions=[]属性
代码如下:
def make_forbidden(modelAdmin,request,queryset): #这里必须是三个参数,modelAdmin指的是调用此函数的modelAdmin的类,queryset指的是我们在后台中选中的记录
print('--->',request,queryset)
queryset.update(status='forbidden')
make_forbidden.short_description = "Set to forbidden" # 定义在action后台中显示的文本内容 class BookAdmin(admin.ModelAdmin):
list_display = ('id','title','publisher','publication_date','status')
search_fields = ('title','publisher__name')
list_filter = ('publisher','publication_date')
list_editable = ('title','publisher','publication_date','status')
list_per_page = filter_horizontal = ('authors',)
raw_id_fields = ('publisher',)
actions = [make_forbidden,] #定义actions属性
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/
ok 添加action的功能就这样实现了。
django admin 扩展之根据不同的status状态,显示不同颜色
引入图片010.png
代码如何显示呢?
1.首先要在models.py文件里的Book类里写一个函数如下:
class Book(models.Model):
title = models.CharField(max_length=)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField() # 添加状态的选择范围,用户在创建的时候只能从这里选择三个状态
status_choices = (('published',u"已出版"),
('producing',u"待出版"),
('forbidden',u"禁书"), )
# 前面定义了选项,这里要创建一个字段用到前面的选项
status = models.CharField(choices=status_choices,max_length=,default='producing')
def __str__(self):
return "<%s>"%(self.title) # 新Book类中新定义colored_status方法
def colored_status(self):
if self.status == "published":
# format_td = format_html('<span stype="padding:2px;color:white">已报名</span>')
format_td = '<span stype="padding:2px;background-color:yellowgreen;color:white">已出版</span>'
elif self.status == 'producing':
format_td = '<span stype="padding:2px;background-color:pink;color:white">待出版</span>'
elif self.status == 'forbidden':
format_td = '<span stype="padding:2px;background-color:orange;color:white">禁书</span>' return format_td
2.定义好后,如何在后台中显示该内容呢?在admin里定义的显示列表中直接将此方法加入即可
class BookAdmin(admin.ModelAdmin):
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方法.
代码如下:
from django.utils.html import format_html # 引入format_html方法
class Book(models.Model):
title = models.CharField(max_length=)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField() # 添加状态的选择范围,用户在创建的时候只能从这里选择三个状态
status_choices = (('published',u"已出版"),
('producing',u"待出版"),
('forbidden',u"禁书"), )
# 前面定义了选项,这里要创建一个字段用到前面的选项
status = models.CharField(choices=status_choices,max_length=,default='producing')
def __str__(self):
return "<%s>"%(self.title) def colored_status(self):
if self.status == "published":
format_td = format_html('<span stype="padding:2px;background-color:yellowgreen;color:white">已出版</span>') # 实例化format_html类
elif self.status == 'producing':
format_td = format_html('<span stype="padding:2px;background-color:pink;color:white">待出版</span>')
elif self.status == 'forbidden':
format_td = format_html('<span stype="padding:2px;background-color:orange;color:white">禁书</span>') return format_td
5.再次访问http://127.0.0.1:8000/admin/app01/book/
python2.0_day18_django_admin的更多相关文章
- 让VIM支持Python2 by update-alternatives
前言 Ubuntu 16+中$ sudo apt install vim所安装的vim只支持Python3,但很多插件如YCM和powerline均需要Python2,那就来场"生命贵在折 ...
- 烂泥:python2.7和python3.5源码安装
本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb 前几天在centos6.6安装ansible时,一直提示python版本不对,导致不能安 ...
- python版本随意切换之python2.7+django1.8.7+uwsgi+nginx源码包部署。
资源准备: wget https://www.python.org/ftp/python/2.7.13/Python-2.7.13.tgz wget https://www.djangoproject ...
- windows XP上实现python2.7.5和python3.4.3共存
windows XP上实现python2.7.5和python3.4.3共存过程记录: 1. 首先安装python2.7.5和python3.4.3,两个版本安装顺序不分前后; 2. 检查系统环境变量 ...
- Python2 基本数据结构源码解析
Python2 基本数据结构源码解析 Contents 0x00. Preface 0x01. PyObject 0x01. PyIntObject 0x02. PyFloatObject 0x04. ...
- Ubuntu安装Python2.7,nodejs
安装Python2.7 sudo add-apt-repository ppa:fkrull/deadsnakes-python2.7sudo apt-get update sudo apt-get ...
- Windows下安装python2和python3双版本
现在大家常用的桌面操作系统有:Windows.Mac OS.ubuntu,其中Mac OS 和 ubuntu上都会自带python.这里我们只介绍下Windows(我用的Win10)环境下的pytho ...
- [python]CentOS 6下安装Python2.7
安装方法 如果在CentOS上自己编译安装过python2.7,使用过程中会发现有些标准库没有安装之类的问题. 逛别人博客的时候发现,一个便捷的方法:使用RHSCL的全称是Red Hat Softwa ...
- 在CentOS 6.5上安装python2.7
1.yum groupinstall “Development tools” 2.安装编译Python需要的组件 yum install zlib-devel bzip2-devel openssl- ...
随机推荐
- K-Means聚类算法的原理及实现【转】
[转]http://www.aboutyun.com/thread-18178-1-1.html 问题导读:1.如何理解K-Means算法?2.如何寻找K值及初始质心?3.如何应用K-Means算法处 ...
- 【Unity】UGUI无法修改字体大小
无论怎么修改Font Size都无法调整字体大小? 如果勾选了Best FIt属性,那么字体大小将不受Font Size属性控制,且字体大小会调整为填满控件的矩形. 文档中对该属性的描述:
- maven打包源码<转>
Plugin: http://maven.apache.org/plugins/maven-source-plugin/ The Source Plugin has five goals: sourc ...
- javascript那些不应该忽视的细节
1.null与Object.prototype使用typeof操作符结果都是object,但他们都不是Object的实例. typeof null // object null instanceof ...
- 篇三:XPath--解析Html
导语:爬虫爬取的界面,大致分为静态界面.ajax异步加载.动态界面.静态界面直接获取HTML对象,然后使用XPath获取值 最有用的路径表达式: 表达式 描述 nodename 选取此节点的所有子节点 ...
- Golang map 如何进行删除操作?
Cyeam 关注 2017.11.02 10:02* 字数 372 阅读 2784评论 0喜欢 3 map 的删除操作 Golang 内置了哈希表,总体上是使用哈希链表实现的,如果出现哈希冲突,就把冲 ...
- Spring Session + Redis实现分布式Session共享
发表于 2016-09-29 文章目录 1. Maven依赖 2. 配置Filter 3. Spring配置文件 4. 解决Redis云服务Unable to configure Redis to k ...
- rails下mysql出错问题mysql_api,blog/text
问题一:提示出错:cannot load such file -- mysql/mysql_api (LoadError) 此时我们回来看gem install mysql 时提示 At the ti ...
- Html5 小球键盘移动
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <t ...
- js学习系列之-----apply和call
apply call 从字面意思就看出来,申请请,呼叫. 打个比方就是别人有什么功能,你向别人,申请 呼叫 一下,哥们拿你的功能用一下,而apply 和call就是实现这样的功能 apply 和cal ...