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

注册好之后,我们就能在后台看到我们的注册的应用:

6def22e997fe98f5ce7258401522a02.png

二、应用类的列表管理界面设置

什么是应用类的列表?我们都知道每个应用里有很多个类,每个类都对应着数据库里的一个表,每个表里都有着多个字段。点击刚才注册的blog应用,点击文章,进入文章列表管理界面:

ffc7c66d504bfec09b6b8b5ad6b422a.png

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']

22abbaed8aff5a829b00ae1080f2569.png

2、进入编辑界面

默认的情况下,我们点击第一个字段,就能进入编辑界面。

7907b526d1cebc1adf957b4ed71d9b3.png

这里默认的是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和标题也能进入编辑界面

f0910a522cfbad903ce651983096694.png

3、"操作选项"的设置

78c215d1554301ff8d184138334e22d.png

操作选项,如上图标记所示。

#列表顶部,设置为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')

效果如下:

672ca85e0b74ec9ccf7d7e57afe2d8d.png

红色的是我们在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'

效果如下:

459505aa37a02ef966129da717490b4.png

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')

刷新浏览器,效果如下:

d67498c473de273384e268b0168dc50.png

6、搜索框

属性如下,用于对指定字段的值进行搜索,支持模糊查询。列表类型,表示在这些字段上进行搜索。

search_fields=[]

在admin.py里添加search_fields,指定标题title做为搜索字段:

blog/admin.py
class ArticleAdmin(admin.ModelAdmin):
...
    search_fields=['title']

刷新得到如下的效果:

8a0834bf1c0c834bc926f124bd5de4e.png

7、右侧栏过滤器和日期筛选

右侧栏过滤器属性如下,只能接收字段,会将对应字段的值列出来,用于快速过滤。一般用于有重复值的字段。

list_filter=[]

日期筛选属性:

date_hierarchy = ''

然在admin.py里添加list_filter,指定作者user做为搜索字段::

blog/admin.py
class ArticleAdmin(admin.ModelAdmin):
...
    list_filter=['user']  #右侧栏过滤器,按作者进行筛选    
    date_hierarchy = 'created_time'  # 详细时间分层筛选 

效果如下:

10c5dc00169ccbe139823bd9fa91fdf.png10c5dc00169ccbe139823bd9fa91fdf.png

注意:

一般ManyToManyField多对多字段用过滤器;标题等文本字段用搜索框;日期时间用分层筛选。过滤器如果是外键需要遵循这样的语法:本表字段__外键表要显示的字段。如:“user__user_name”。

二、修改后台管理页面头部显示内容和页面标题

blog/admin.py
admin.site.site_header = 'Django中文网管理后台'admin.site.site_title = 'Django中文网'

效果如下:

89b44669e1042223c6303b323d74023.png

三、重写模板

这个可治任何不服。想要什么效果,就直接自己写。

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)刷新即可看到效果
其它后台的模板可以按照相同的方式进行修改。