Django2.0入门教程:定制Admin管理后台
在管理后台与model模型文章里,我们曾经有一个操作,就是在admin.py里注册blog应用,这样blog应用才会在后台显示出来,我们才能在后台对这个应用进行管理。这就是Django自带的后台管理的特色之一,它可以让我们快速便捷管理数据,后台管理可以在各个app的admin.py文件中进行控制。
想要对APP应用进行管理,最基本的前提是要先在settings里对其进行注册,就是在INSTALLED_APPS里把APP名添加进去,更多的可以查看文章:全局配置settings详解
下面我们以一个blog应用来举例,向大家介绍一些常用的自定制admin的方法。如下为blog的models的Article表的内容:
class Article(models.Model): title = models.CharField('标题', max_length=70) keywords = models.CharField('文章关键词', max_length=120, blank=True, null=True) excerpt = models.TextField('摘要', max_length=200, blank=True) category = models.ForeignKey(Category, on_delete=models.CASCADE, verbose_name='分类', blank=True, null=True) body = models.TextField('内容') user = models.ForeignKey(Userinfo, on_delete=models.CASCADE, verbose_name='作者') views = models.PositiveIntegerField('阅读量', default=0) top = models.IntegerField(choices=[(0, '否'), (1, '是'), ], default=0, verbose_name='是否推荐') created_time = models.DateTimeField('发布时间', auto_now_add=True) modified_time = models.DateTimeField('修改时间', auto_now=True) class Meta: verbose_name = '文章'verbose_name_plural = '文章'def __str__(self): return self.title
一、管理后台注册需要管理的应用
只有注册了,我们才能在管理后台看到这个APP应用,才能对其进行管理,这个注册有两种方式:
1、装饰器注册
from django.contrib import admin from .models import Article #Blog模型的管理器 @admin.register(Article) class ArticleAdmin(admin.ModelAdmin): list_display=('id', 'category', 'title', 'user','views','created_time')
2、注册参数
from django.contrib import admin from .models import Article #Blog模型的管理器 class ArticleAdmin(admin.ModelAdmin): list_display=('id', 'category', 'title', 'user','views','created_time') #在admin中注册绑定 admin.site.register(Article,ArticleAdmin)
注册参数将管理器和注册语句分开,有时容易忘记写注册语句,或者模型很多,不容易对应。所以一般推荐第一种方法。
注意:我们注册的时候,先需要在头部把需要注册的类导入。如:from .models import Article
注册好之后,我们就能在后台看到我们的注册的应用:
二、应用类的列表管理界面设置
什么是应用类的列表?我们都知道每个应用里有很多个类,每个类都对应着数据库里的一个表,每个表里都有着多个字段。点击刚才注册的blog应用,点击文章,进入文章列表管理界面:
1、类列表的基本设置
这里面我们用得比较多的设置是:显示字段、每页记录数和排序等。点击列头可以进行升序或降序排列。
from django.contrib import admin from .models import Article #Article模型的管理器 @admin.register(Article) class ArticleAdmin(admin.ModelAdmin): #listdisplay设置要显示在列表中的字段(id字段是Django模型的默认主键) list_display=('id', 'title', 'user','views','created_time') #list_per_page设置每页显示多少条记录,默认是100条 list_per_page = 50 #ordering设置默认排序字段,负号表示降序排序 ordering = ('-created_time',) #list_editable 设置默认可编辑字段,在列表里就可以编辑 list_editable = ['title', 'user'] #fk_fields 设置显示外键字段 fk_fields = ['category']
2、进入编辑界面
默认的情况下,我们点击第一个字段,就能进入编辑界面。
这里默认的是ID这个字段,我们可以设置其他字段进入编辑界面,比如标题:
from django.contrib import admin from .models import Category, Article @admin.register(Article) class ArticleAdmin(admin.ModelAdmin): list_display = ('id', 'category','title', 'user','views','created_time','modified_time') list_per_page = 50ordering = ('-created_time',) #设置哪些字段可以点击进入编辑界面 list_display_links = ('id', 'title')
现在我们点击ID和标题也能进入编辑界面
3、"操作选项"的设置
操作选项,如上图标记所示。
#列表顶部,设置为False不在顶部显示,默认为True。 actions_on_top=True #列表底部,设置为False不在底部显示,默认为False。 actions_on_bottom=False
数据较多的话,建议顶部和底部都加上,操作的时候能节省点时间。
如果我们想定制自己的行为的话,可以用下面的方法:
# 定制Action行为具体方法 def func(self, request, queryset): queryset.update(created_time='2018-09-28') #批量更新我们的created_time字段的值为2018-09-28 func.short_description = "中文显示自定义Actions" actions = [func, ]
4、将方法作为列
列可以是模型字段,还可以是模型方法,要求方法有返回值。
通过设置short_description属性,可以设置在admin站点中显示的列名。
blog/models.py class Article(models.Model): ... ... #定义一个方法 def riqi(self): return self.created_time.strftime("%b %d %Y %H:%M:%S") # 设置方法字段在admin中显示的标题 riqi.short_description = '发布日期'
然后在admin.py里把我们定义的方法加在list_display里:
blog/admin.py class ArticleAdmin(admin.ModelAdmin): list_display = ('id', 'category','title', 'user','views','created_time','riqi')
效果如下:
红色的是我们在models里定义的方法返回的效果。
注意:方法列是不能排序的,如果需要排序需要为方法指定排序依据。
admin_order_field='模型类字段'
blog/models.py class Article(models.Model): ... ... #定义一个方法 def riqi(self): return self.created_time.strftime("%b %d %Y %H:%M:%S") # 设置方法字段在admin中显示的标题 riqi.short_description = '发布日期' #指定排序依据 riqi.admin_order_field='created_time'
效果如下:
5 关联对象
无法直接访问关联对象的属性或方法,可以在模型类中封装方法,访问关联对象的成员。例如,blog模型里有一个文章分类,分类里有一个分类排序字段'index',我们需要把这个关联进来。
blog/models.py class Article(models.Model): .... .... #定义关联对象字段 def paixu(self): return self.category.index paixu.short_description = '分类排序'
然后在admin.py里把我们定义的方法加在list_display里:
blog/admin.py class ArticleAdmin(admin.ModelAdmin): list_display = ('id', 'category','title', 'user','views','created_time','paixu')
刷新浏览器,效果如下:
6、搜索框
属性如下,用于对指定字段的值进行搜索,支持模糊查询。列表类型,表示在这些字段上进行搜索。
search_fields=[]
在admin.py里添加search_fields,指定标题title做为搜索字段:
blog/admin.py class ArticleAdmin(admin.ModelAdmin): ... search_fields=['title']
刷新得到如下的效果:
7、右侧栏过滤器和日期筛选
右侧栏过滤器属性如下,只能接收字段,会将对应字段的值列出来,用于快速过滤。一般用于有重复值的字段。
list_filter=[]
日期筛选属性:
date_hierarchy = ''
然在admin.py里添加list_filter,指定作者user做为搜索字段::
blog/admin.py class ArticleAdmin(admin.ModelAdmin): ... list_filter=['user'] #右侧栏过滤器,按作者进行筛选 date_hierarchy = 'created_time' # 详细时间分层筛选
效果如下:
注意:
一般ManyToManyField多对多字段用过滤器;标题等文本字段用搜索框;日期时间用分层筛选。过滤器如果是外键需要遵循这样的语法:本表字段__外键表要显示的字段。如:“user__user_name”。
二、修改后台管理页面头部显示内容和页面标题
blog/admin.py admin.site.site_header = 'Django中文网管理后台' admin.site.site_title = 'Django中文网'
效果如下:
三、重写模板
这个可治任何不服。想要什么效果,就直接自己写。
1)在templates/目录下创建admin目录
2)打开当前虚拟环境中Django包的目录,再向下找到admin的模板。不知道目录在哪,可以使用下面的方法:
进入python终端
root@server-zc:/home/x/mysite# python >>> import django >>> django.__file__ '/usr/local/lib/python3/dist-packages/django/__init__.pyc'
找到包的目录之后,复制它,我们需要的模板目录为
/usr/local/lib/python3/dist-packages/django/contrib/admin/
3)将需要更改文件拷贝到(在项目的templates文件夹里面创建admin文件夹)里,此处以base_site.html为例。
{% extends "admin/base.html" %} {% block title %} {{ title }} | {{ site_title|default:_('Django site admin') }} {% endblock %} {% block branding %} <h1 id="site-name"> <a href="{% url 'admin:index' %}">{{ site_header|default:_('Django administration') }}</a> </h1> <hr> <h1>自定义的管理页模板</h1> <hr> {% endblock %} {% block nav-global %}{% endblock %}
4)刷新即可看到效果
其它后台的模板可以按照相同的方式进行修改。
文章评论 2
请问django写文章的时候怎么样才可以存草稿,如果用百度富文本 怎么存草稿,之前也配置了 但那个存草稿没用,导致写文章的时候必须一次性写完,如果不小心关了页面 就全部都没有了
5 关联对象中,Category返回的关键字段应该是id,index这个字段在之前没有被声明过