慕课网-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)    收藏  举报

导航