三【用django2.0来开发】后台会员管理(二) ModelAdmin 模型管理的使用方法

上一节我们生成了一个会员的模型, 这一节主要讲如何控制会员模块在后台的操作, 包括控制后台中会员模块列表的展示以及新增/编辑页面的表单和新增编辑时的验证

项目地址:django_example

运行开发服务器

> cd cms
> python manager.py runserver

打开浏览器http://127.0.0.1:8000/admin
就可以看到后台的登录窗口

创建超级管理员

因为我们还没有后台的超级管理员, 先用命令行创建一个

> cd cms
> python manager.py createsuperuser

按照提示输入Username, Password即可, 在浏览器中输入账号密码就可以登录到后台了

将Account模块注册到后台中

登录成功后发现没有我们的Account模块, 现在我们就来把Account模块注册到后台中

# account/admin.py
from django.contrib import admin
from .models import Account

admin.site.register(Account)

然后再刷新浏览器, 就会发现出现了Account模块, 但是显示的界面全都是英文的

另外还有一种装饰器的注册方式

from django.contrib import admin
from .models import Account

@admin.register(Account)
class AccountAdmin(admin.ModelAdmin):
    pass

也会实现同样的效果

将django中文化

django当然替我们想到了这一点

# cms/settings.py
# 指定语言为中文
LANGUAGE_CODE = 'zh-Hans'
# 指定时区
TIME_ZONE = 'PRC'
# 改为False, 存入数据库的时间才正常, 否则会比正常时间少八个小时
USE_TZ = False

用ModelAdmin来修改管理界面与操作

from django.contrib import admin
from .models import Account

@admin.register(Account)
class AccountAdmin(admin.ModelAdmin):
    # 控制列表页按钮显示位置
    actions_on_top = False
    actions_on_bottom = True

    # 是否显示列表页数据数量([选中了n个中的m个])
    actions_selection_counter = True

ModelAdmin是后台指定模块的一个控制类, 包括后台的列表页面样式、数据、以及编辑/新增, 操作方法等都由这个类控制, 当继承这个类, 我们就可以通过覆盖这个类的方法, 来完成我们的一些操作

ModelAdmin的配置参数

actions
指定自定义的操作列表
如果是定义的function, 则
actions = [函数名]
如果是class的function, 则
actions = ['类中的方法名']

actions_on_top
指定列表页按钮的是否在上边, 设置为True则在上面

image.png

actions_on_bottom
同actions_on_top, 只不过是是否在下方

image.png

date_hierarchy
只可作用在DateField和DateTimeField上, 设置后, 可以根据时间段, 去过滤数据

class AccountAdmin(models.ModelAdmin):
    ...忽略其他代码
    date_hierarchy = 'create_time'
image.png

exclude
排除新增/编辑页面需要显示的字段

fields
指定新增、编辑页面要显示的字段

fields = ('account', 'nickname', 'password', 'email', 'phone', 'status')

list_display
控制列表页要显示的字段

list_display = ('account', 'nickname', 'email', 'phone', 'status',
                    'create_time')

list_display_links
指定哪些在列表页显示的字段上加链接

list_display_links = ('account', )

list_editable
指定哪些字段可以直接在列表页编辑

 list_editable = ('status', )
image.png

list_filter
列表页过滤条件

list_filter = ('status', )
image.png

ordering
排序, 影响order_by

ordering = ['id]

list_per_page
控制每页显示的数据数量

ModelAdmin增加自定义操作

每个会员的状态有启用和禁用两种, 现在我们想要增加一个操作来批量启用和禁用

先定义一个操作的方法

class AccountAdmin(models.ModelAdmin):
    def disable_account(self, request, queryset):
        queryset.update(status=0)
    
    disable_account.short_description='启用'

disable_account包含两个参数
request 是HttpRequest对象, 包含请求的所有清晰
queryset 是数据库操作的QuerySet对象, 也就是当我们点击了操作按钮后, 就会执行queryset.filter(id__in=选中的id).update(status=0), django已经提前帮我们写好了queryset.filter()这部分写好了。

disable_account.short_description是指定这个操作在后台显示的名称

定义好方法后, 需要将操作的方法写入到actions属性中才会生效

class AccountAdmin(models.ModelAdmin):
    actions = ['disable_ccount']
    def disable_account(self, request, queryset):
        queryset.update(status=0)
    
    disable_account.short_description='启用'

同样的, 我们可以再定义一个enable_accoun方法。
然后在列表页的动作中, 就可以看到我们定义的操作了

另一种增加自定义操作的方法

这种方法可以用在一般通用方法中, 比如我们的account模型有一个is_deleted字段, 这个字段的意思是在数据删除后, 设置is_deleted为1, 默认正常时是0, 而django默认的删除操作是直接物理删除数据, 所以我们需要重写删除的方法

# account/admin.py
from django.contrib import admin

# 禁用默认的删除操作
admin.site.disable_action('delete_selected')

这样就会禁用掉默认的删除操作

# 重新定义一个删除操作
def deleted_select(self, request, queryset):
    queryset.update(is_deleted=1)

原理和之前我们增加操作方法一样
将这个操作注册到admin站点中

admin.site.add_action(deleted_select, '删除数据')

add_action第一个参数是操作的函数名, 第二个是显示的按钮

修改ModelAdmin默认的数据查询方法

在我们修改了删除操作后, 发现即使我们删除了数据, 列表中还是会出现, 这个是不符合我们预期的
所以我们要重写ModelAdmin的查询数据方法, 过滤掉is_deleted=1的数据

class AccountAdmin(admin.ModelAdmin):
    ...省略代码
    def get_queryset(self, request):
        queryset = super().get_queryset(request)
        return queryset.filter(is_deleted=0)

第一步queryset = super().get_queryset(request), 就是获取到ModelAdmin的查询对象QuerySet, 然后增加过滤条件filter, 然后ModelAdmin会继续操作查询的方法。

至此, 我们的会员管理列表的全部操作就讲完了。下一节, 就需要重点讲一下

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容