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后台,从而可以在后台管理平台进行操作呢,这里进行介绍。
下面的展示基于我们之前的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('跳转', obj.id)
# 跳转到百度
return format_html('跳转', 'http://www.baidu.com')
启动服务,进行访问:
点击跳转,可以跳转到百度首页。
在实际的项目应用当中,对于一个项目的后台管理平台,我们很少直接使用Django自带的Admin,更多时候是自己开发后台管理平台,这样可以更加自由的定制化后台管理平台的功能。
https://coding.imooc.com/class/393.html