慕课网-Django入门到进阶-更适合Python小白的系统课程-第6章Django中的Admin的基本使用-6-2Admin样式设置和功能二次开发
第6章 Django中 的 Admin 的基本使用
6-2 Admin 样式设置和功能二次开发
样式的设置
| 样式变量 | 说明 | 举例 |
| list_display | 可显示的数据库字段 | list_display = ['id', 'name'] |
| list_filter | 右边栏过滤器 | list_filter = ['name'] |
| search_fileds | 搜索 | 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 = ['id', 'name'] |
自定义字段
方法1 在 Model 中定义
def times(self):
_time = time.localtime(self.create_time)
return time.strftime(%Y-%m-%d %H:%M:%S", _time)
方法2 在 Admin 中定义
def times(self, obj):
_time = time.localtime(obj.create_time)
return tiem.strftime("%Y-%m-%d %H:%M:%S", _time)
Ps 自定义字段别名
times.short_description = 'xx'
自定义 html 语言
导入方法
from django.utils.html import format_html
使用方法
def image_data(self, obj):
return format_html('<img src="{}" width="100px" />', obj.image)
imageField 的显示方法
导入方法
from django.utils.safestring import mark_safe
使用方法
def image_data(self, obj):
return mark_safe('<img src="%s" width="100px" />' % obj.image.url)
二次开发获取数据函数
def get_queryset(self, request): # 对返回的数据进行过滤,可用做权限控制
result = super(MusicResultAdmin, self).get_queryset(request)
if request.user.superuser:
return result
else:
return result.filter('xx') # 等同于 model 中的 filter
二次开发获取保存函数
def save_model(self, request, obj, form, change):
if change: # 修改数据
obj.image = 'http://www.verycd.com'
else: # 创建数据
obj.image = 'http://www.verycd.com'
super(MusicResultAdmin, self).save_model(request, obj, form, change)
实例
1.在项目 message_test 下命令行窗口添加超级管理员
python manage.py createsuperuser
2.在项目 message_test 下命令行窗口启动服务
python manage.py runserver


3.在项目 message_test 下目录 app,修改文件 admin.py
# coding:utf-8
from django.contrib import admin
from .models import Message
@admin.register(Message)
class MessageAdmin(admin.ModelAdmin):
pass
4.重新刷新页面



5.在项目 message_test 下目录 app,修改文件 admin.py
# coding:utf-8
from django.contrib import admin
from .models import Message
@admin.register(Message)
class MessageAdmin(admin.ModelAdmin):
list_display = ['id', 'content', 'message_type', 'created_time']
6.重新刷新页面

7.在项目 message_test 下目录 app,修改文件 models.py
# coding:utf-8
import time
from django.db import models
from .consts import MessageType
class Message(models.Model):
content = models.TextField()
message_type = models.CharField(max_length=10, db_index=True)
created_time = models.IntegerField(default=0)
def __str__(self):
return 'type:{}, content:{}'.format(self.message_type, self.content)
@property
def message_typ(self):
try:
return MessageType[self.message_type]
except:
return MessageType.info
def times(self):
_time = time.localtime(self.created_time)
return time.strftime('%Y-%m-%d %H:%M:%S', _time)
8.在项目 message_test 下目录 app,修改文件 admin.py
# coding:utf-8
from django.contrib import admin
from .models import Message
@admin.register(Message)
class MessageAdmin(admin.ModelAdmin):
list_display = ['id', 'content', 'message_type', 'times']
9.测试

10.在项目 message_test 下目录 app,修改文件 admin.py,让页面 message_type 和 created_time 不能修改
# coding:utf-8
from django.contrib import admin
from .models import Message
@admin.register(Message)
class MessageAdmin(admin.ModelAdmin):
list_display = ['id', 'content', 'message_type', 'times']
readonly_fields = ('message_type', 'created_time')
改动前

改动后

11.在项目 message_test 下目录 app,修改文件 admin.py,添加过滤字段 message_type
# coding:utf-8
from django.contrib import admin
from .models import Message
@admin.register(Message)
class MessageAdmin(admin.ModelAdmin):
list_display = ['id', 'content', 'message_type', 'times']
readonly_fields = ('message_type', 'created_time')
list_filter = ('message_type',)
12.测试

13.添加新数据,由于页面 message_type 和 created_time 不能修改 ,只能通过其它方式



14.在项目 message_test 下目录 app,修改文件 admin.py,添加模糊搜索
# coding:utf-8
from django.contrib import admin
from .models import Message
@admin.register(Message)
class MessageAdmin(admin.ModelAdmin):
list_display = ['id', 'content', 'message_type', 'times']
readonly_fields = ('message_type', 'created_time')
list_filter = ('message_type',)
search_fields = ['content']
15.测试


16.在项目 message_test 下目录 app,修改文件 admin.py,按 id 升序排序
# coding:utf-8
from django.contrib import admin
from .models import Message
@admin.register(Message)
class MessageAdmin(admin.ModelAdmin):
list_display = ['id', 'content', 'message_type', 'times']
readonly_fields = ('message_type', 'created_time')
list_filter = ('message_type',)
search_fields = ['content']
ordering = ['id']
17.测试

18.在项目 message_test 下目录 app,修改文件 admin.py,按 id 降序排序
# coding:utf-8
from django.contrib import admin
from .models import Message
@admin.register(Message)
class MessageAdmin(admin.ModelAdmin):
list_display = ['id', 'content', 'message_type', 'times']
readonly_fields = ('message_type', 'created_time')
list_filter = ('message_type',)
search_fields = ['content']
# ordering = ['id']
ordering = ['-id']
19.测试

20.在项目 message_test 下目录 app,修改文件 admin.py,分页
# coding:utf-8
from django.contrib import admin
from .models import Message
@admin.register(Message)
class MessageAdmin(admin.ModelAdmin):
list_display = ['id', 'content', 'message_type', 'times']
readonly_fields = ('message_type', 'created_time')
list_filter = ('message_type',)
search_fields = ['content']
# ordering = ['id']
ordering = ['-id']
list_per_page = 5
21.测试

22.在项目 message_test 下目录 app,修改文件 admin.py,修改数据
# coding:utf-8
from django.contrib import admin
from .models import Message
@admin.register(Message)
class MessageAdmin(admin.ModelAdmin):
list_display = ['id', 'content', 'message_type', 'times']
readonly_fields = ('message_type', 'created_time')
list_filter = ('message_type',)
search_fields = ['content']
# ordering = ['id']
ordering = ['-id']
list_per_page = 5
def save_model(self, request, obj, form, change):
if change:
obj.content = obj.content + ' update'
else:
obj.content = obj.content + ' update'
super(MessageAdmin, self).save_model(request, obj, form, change)
23.测试


24.在项目 message_test 下目录 app,修改文件 admin.py,让 message_type 和 created_time 能修改
# coding:utf-8
from django.contrib import admin
from .models import Message
@admin.register(Message)
class MessageAdmin(admin.ModelAdmin):
list_display = ['id', 'content', 'message_type', 'created_time']
# readonly_fields = ('message_type', 'created_time')
list_filter = ('message_type',)
search_fields = ['content']
# ordering = ['id']
ordering = ['-id']
list_per_page = 5
def save_model(self, request, obj, form, change):
if change:
obj.content = obj.content + ' update'
else:
obj.content = obj.content + ' update'
super(MessageAdmin, self).save_model(request, obj, form, change)
25.测试


26.在项目 message_test 下目录 app,修改文件 admin.py,添加新字段 return_href
# coding:utf-8
from django.contrib import admin
from django.utils.html import format_html
from .models import Message
@admin.register(Message)
class MessageAdmin(admin.ModelAdmin):
list_display = ['id', 'content', 'message_type', 'created_time', 'return_href']
# readonly_fields = ('message_type', 'created_time')
list_filter = ('message_type',)
search_fields = ['content']
# ordering = ['id']
ordering = ['-id']
list_per_page = 5
def save_model(self, request, obj, form, change):
if change:
obj.content = obj.content + ' update'
else:
obj.content = obj.content + ' update'
super(MessageAdmin, self).save_model(request, obj, form, change)
def return_href(self, obj):
return format_html('<a href="">跳转', obj.message_type)
27.测试

28.在项目 message_test 下目录 app,修改文件 admin.py,添加跳转地址为 http://www.baidu.com
# coding:utf-8
from django.contrib import admin
from django.utils.html import format_html
from .models import Message
@admin.register(Message)
class MessageAdmin(admin.ModelAdmin):
list_display = ['id', 'content', 'message_type', 'created_time', 'return_href']
# readonly_fields = ('message_type', 'created_time')
list_filter = ('message_type',)
search_fields = ['content']
# ordering = ['id']
ordering = ['-id']
list_per_page = 5
def save_model(self, request, obj, form, change):
if change:
obj.content = obj.content + ' update'
else:
obj.content = obj.content + ' update'
super(MessageAdmin, self).save_model(request, obj, form, change)
def return_href(self, obj):
return format_html('<a href="">跳转', 'http//www.baidu.com')
posted on 2020-02-10 12:30 herisson_pan 阅读(9) 评论(0) 收藏 举报
浙公网安备 33010602011771号