Django学习Day17——admin后台管理

Django中的Admin后台管理

Admin后台管理的基础知识

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

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

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

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

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

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

python manage.py migrate

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

 

(4)创建管理员账户

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

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

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

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

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

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

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

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

访问显示如下:

3、显示自定义字段

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

(1)在model中进行实现:

app/models.py:

然后在list_display中添加即可:

(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

4、在后台直接添加数据

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

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

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

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

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

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均可以进行查找:

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'] # 逆序

正序:                                                                                                                                                  逆序:

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

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)

启动服务,进行访问:

修改数据:

新增数据:

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('<a href={}>跳转</a>', obj.id)
        # 跳转到百度
        return format_html('<a href={}>跳转</a>', 'http://www.baidu.com')

启动服务,进行访问:

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

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

参考资料

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

 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值