Django学习Day17——admin后台管理

Django中的Admin后台管理

Admin后台管理的基础知识

Django Admin管理后台,是Django自带的网站后台管理平台,主要功能是对数据库中的数据进行增删改查的功能。只有管理员才可以访问Admin后台,后台管理平台是绝大多数应用都应该具备的功能。

当我们创建Django项目之后,在项目根目录下的urls.py中,已经默认配置好后台管理平台的路由,如下所示:

Django学习Day17——admin后台管理_第1张图片

我们启动服务,通过http://127.0.0.1:8000/admin即可进行访问,访问界面如下:

Django学习Day17——admin后台管理_第2张图片

因为后台管理平台只有管理员才可以进行访问,因此我们需要创建管理员账号:

(1)在settings.py中完成数据库的相关配置:

Django学习Day17——admin后台管理_第3张图片

(2)执行数据库迁移操作:

python manage.py migrate

(3)可以看到在数据库中生成了多张和Django相关的数据表(其中,auth_user表存储管理员用户)

 Django学习Day17——admin后台管理_第4张图片

(4)创建管理员账户

Django学习Day17——admin后台管理_第5张图片

(5)在数据库中即可查询到管理员账户

这时,我们就可以登录后台管理平台:

Django学习Day17——admin后台管理_第6张图片

这时,后台显示为英文,我们可以在settings.py中进行语言和时区的设置:

Django学习Day17——admin后台管理_第7张图片

此时,重新访问后台,可以看到语言均显示为中文,并且在用户中可以看到我们之前创建的超级用户:

Django学习Day17——admin后台管理_第8张图片

Admin后台样式与功能开发

上面我们提到Admin后台管理平台是对数据库进行增删改查的功能,那么如何把我们项目中使用的数据库绑定在Admin后台,从而可以在后台管理平台进行操作呢,这里进行介绍。

下面的展示基于我们之前的message项目Django学习Day12——模型的使用(四)。在之前的message项目中,我们在本地数据库中存储了message的内容,包括消息类型,消息内容,创建时间,定义如下:

app/models.py:

from django.db import models
from .consts import MessageType

class Message(models.Model):
    content = models.TextField()
    message_type = models.CharField(max_length=20, db_index=True)
    created_time = models.IntegerField(default=0)

    def __str__(self):
        return '消息内容:{}, 消息类型:{}'.format(self.content, self.message_type)

    # @property装饰器就是负责把一个类中的方法变成属性调用
    # 因此,在外面调用的时候,可以通过这样的方式:m = Message(), type = m.get_message_type。不用加括号
    @property
    def get_message_type(self):
        try:
            return MessageType[self.message_type]
        except Exception as e:
            return MessageType.info

1、将项目数据库绑定在Admin后台

app/admin.py:

# coding:utf-8
from django.contrib import admin
from .models import Message

@admin.register(Message)
class MessageAdmin(admin.ModelAdmin):
    pass

此时,我们启动服务,在浏览器中进行访问:

Django学习Day17——admin后台管理_第9张图片

可以看到,在后台管理平台中有我们创建的Message数据表,点击可以访问其中的数据内容:

Django学习Day17——admin后台管理_第10张图片

对于Admin后台中展示的内容我们可以进行定制化展示,常用的个性化展示功能如下:

样式变量 说明 举例
list_display 可显示的数据库字段 list_display = ['id', 'name']
list_filter 右边栏过滤器 list_filter = ['name']
search_fields 可根据什么搜索 search_fields = ['name']
ordering 排序 ordering = ['id']   # 反序 '-id'
list_per_page 每页显示数据的条数 list_per_page = 10
readonly_fields 只读的字段 readonly_fields = ('name',)
date_hierarchy 显示时间分层,仅支持时间类型 date_hierarchy = '时间字段'
list_display_links 设置可编辑字段 list_display_links = ['name']

2、设置显示的字段

# coding:utf-8
from django.contrib import admin
from .models import Message

@admin.register(Message)
class MessageAdmin(admin.ModelAdmin):
    list_display = ['id', 'message_type', 'content', 'created_time']

访问显示如下:

Django学习Day17——admin后台管理_第11张图片

3、显示自定义字段

在Admin后台管理平台我们也可以显示自定义的字段,即没有出现在数据表中的字段。有两种实现方式:

(1)在model中进行实现:

app/models.py:

Django学习Day17——admin后台管理_第12张图片

然后在list_display中添加即可:

Django学习Day17——admin后台管理_第13张图片

Django学习Day17——admin后台管理_第14张图片

(2)在app/admin.py中进行实现

# coding:utf-8
from django.contrib import admin
from .models import Message
import time

@admin.register(Message)
class MessageAdmin(admin.ModelAdmin):
    list_display = ['id', 'message_type', 'content', 'convert_time_admin']


    def convert_time_admin(self, obj):
        timeArray = time.localtime(obj.created_time)
        otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
        return otherStyleTime

Django学习Day17——admin后台管理_第15张图片

4、在后台直接添加数据

直接点击“增加MESSAGE+”的按钮,输入消息内容,即可新增消息成功。

Django学习Day17——admin后台管理_第16张图片

此时,已经自动添加到我们本地的数据库中:

Django学习Day17——admin后台管理_第17张图片

5、设置字段为只读

现在我们点击每一条消息内容进去,是可以进行修改的,我们可以自定义某些字段为不可修改。

# coding:utf-8
from django.contrib import admin
from .models import Message
import time

@admin.register(Message)
class MessageAdmin(admin.ModelAdmin):
    list_display = ['id', 'message_type', 'content', 'convert_time_admin']
    readonly_fields = ('message_type', 'created_time')

    def convert_time_admin(self, obj):
        timeArray = time.localtime(obj.created_time)
        otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
        return otherStyleTime

此时,消息类型和创建时间是不能修改的:

Django学习Day17——admin后台管理_第18张图片

6、右边栏过滤器

我们可以设置根据字段进行过滤,比如根据消息类型进行过滤,当点击某一消息类型之后,只显示该消息类型下的数据:

# coding:utf-8
from django.contrib import admin
from .models import Message
import time

@admin.register(Message)
class MessageAdmin(admin.ModelAdmin):
    list_display = ['id', 'message_type', 'content', 'convert_time_admin']
    readonly_fields = ('message_type', 'created_time')
    list_filter = ['message_type', 'id']

Django学习Day17——admin后台管理_第19张图片

7、设置搜索字段

# coding:utf-8
from django.contrib import admin
from .models import Message
import time

@admin.register(Message)
class MessageAdmin(admin.ModelAdmin):
    list_display = ['id', 'message_type', 'content', 'convert_time_admin']
    readonly_fields = ('message_type', 'created_time')
    list_filter = ['message_type', 'id']
    search_fields = ['id','message_type']

在搜索的时候,通过id或者message_type均可以进行查找:

Django学习Day17——admin后台管理_第20张图片

8、设置排序

我们可以设置数据展示的先后顺序,例如我们根据ID字段进行排序:

# coding:utf-8
from django.contrib import admin
from .models import Message
import time

@admin.register(Message)
class MessageAdmin(admin.ModelAdmin):
    list_display = ['id', 'message_type', 'content', 'convert_time_admin']
    readonly_fields = ('message_type', 'created_time')
    list_filter = ['message_type', 'id']
    search_fields = ['id','message_type']
    ordering = ['id']  # 正序
    # ordering = ['-id'] # 逆序

正序:                                                                                                                                                  逆序:

Django学习Day17——admin后台管理_第21张图片Django学习Day17——admin后台管理_第22张图片

9、分页展示

# coding:utf-8
from django.contrib import admin
from .models import Message
import time

@admin.register(Message)
class MessageAdmin(admin.ModelAdmin):
    list_display = ['id', 'message_type', 'content', 'convert_time_admin']
    readonly_fields = ('message_type', 'created_time')
    list_filter = ['message_type', 'id']
    search_fields = ['id','message_type']
    ordering = ['id']  # 正序
    # ordering = ['-id'] # 逆序
    list_per_page = 2

Django学习Day17——admin后台管理_第23张图片

10、二次开发保存函数

我们可以修改一下数据保存的函数,使得在每次数据保存之后,增加一些我们想要的功能:

比如我们这里,想要实现在每次修改数据或者新增数据之后,在消息内容这一栏增加“修改”或者“新增”,以指示这是新增还是原有内容的修改。

# coding:utf-8
from django.contrib import admin
from .models import Message
import time

@admin.register(Message)
class MessageAdmin(admin.ModelAdmin):
    list_display = ['id', 'message_type', 'content', 'convert_time_admin']
    # readonly_fields = ('message_type', 'created_time')
    list_filter = ['message_type', 'id']
    search_fields = ['id','message_type']
    ordering = ['id']  # 正序
    # ordering = ['-id'] # 逆序
    # list_per_page = 2


    def convert_time_admin(self, obj):
        timeArray = time.localtime(obj.created_time)
        otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
        return otherStyleTime

    def save_model(self, request, obj, form, change):
        if change:
            # update
            obj.content = obj.content + "   修改"
        else:
            # create
            obj.content = obj.content + "   新增"

        super(MessageAdmin, self).save_model(request, obj, form, change)

启动服务,进行访问:

修改数据:

Django学习Day17——admin后台管理_第24张图片

Django学习Day17——admin后台管理_第25张图片

新增数据:

Django学习Day17——admin后台管理_第26张图片

Django学习Day17——admin后台管理_第27张图片

11、自定义HTML语言

在admin后台管理中,我们可以将HTML语言作为某个字段的显示内容,实现如下:

# coding:utf-8
from django.contrib import admin
from .models import Message
from django.utils.html import format_html
import time

@admin.register(Message)
class MessageAdmin(admin.ModelAdmin):
    list_display = ['id', 'message_type', 'content', 'convert_time_admin', 'return_href']
    # readonly_fields = ('message_type', 'created_time')
    list_filter = ['message_type', 'id']
    search_fields = ['id','message_type', 'content']
    ordering = ['id']  # 正序
    # ordering = ['-id'] # 逆序
    # list_per_page = 2


    def convert_time_admin(self, obj):
        timeArray = time.localtime(obj.created_time)
        otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
        return otherStyleTime

    def save_model(self, request, obj, form, change):
        if change:
            # update
            obj.content = obj.content + "   修改"
        else:
            # create
            obj.content = obj.content + "   新增"

        super(MessageAdmin, self).save_model(request, obj, form, change)

    def return_href(self, obj):
        # obj表示模型Message类
        # 跳转到该ID对应的消息内容
        # return format_html('跳转', obj.id)
        # 跳转到百度
        return format_html('跳转', 'http://www.baidu.com')

启动服务,进行访问:

Django学习Day17——admin后台管理_第28张图片

点击跳转,可以跳转到百度首页。

在实际的项目应用当中,对于一个项目的后台管理平台,我们很少直接使用Django自带的Admin,更多时候是自己开发后台管理平台,这样可以更加自由的定制化后台管理平台的功能。

参考资料

https://coding.imooc.com/class/393.html

 

 

你可能感兴趣的:(Django开发框架,python,django)