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

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

1.jpg

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

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

2.jpg
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']

3.jpg
2、进入编辑界面

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

4.jpg

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

5.jpg
3、"操作选项"的设置

6.jpg

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

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

效果如下:

1.jpg

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

效果如下:

2.jpg
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')

刷新浏览器,效果如下:

3.jpg
6、搜索框

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

search_fields=[]

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

blog/admin.py

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

刷新得到如下的效果:

4.jpg


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

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

list_filter=[]

日期筛选属性:

date_hierarchy = ''

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

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

效果如下:

6.jpg

注意:

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

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

blog/admin.py

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

效果如下:

6.jpg
三、重写模板

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

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