给Django的Admin添加自定义Action 并移除需要选择对象的限制
不得不说,Django的Admin真的给开发带来很多便利,这不,我又来折腾了,这次是添加自定义的action
这个自定义的Action可以看看官方文档的介绍,很详细,不再赘述。
https://docs.djangoproject.com/en/3.0/ref/contrib/admin/actions/
界面效果

Django默认的添加完action是要选择下面的对象才能提交的,不过我不需要啊,我就要简简单单点击开始抽奖就直接抽奖出来了,功夫不负有心人,我还是在Stack Overflow找到了解决方案,(果然是面向sof编程)
接下来介绍一下如何实现的~
定义Action
在admin.py中写代码:
@admin.register(models.PrizeLog)
class PrizeLogAdmin(admin.ModelAdmin):
actions = ['draw_prize']
def draw_prize(self, request, queryset):
pass
draw_prize.short_description = '开始抽奖'
draw_prize.type = 'warning'
draw_prize.confirm = '确认即开始抽奖并发送中奖通知~'
这样就把按钮显示出来了,但是现在点击完是不会执行draw_prize方法里面的代码的,因为Django限制必须选择至少一个对象才能进行action。
接下来我们曲线救国,来绕过这个限制。
移除限制
还是在这个Admin类中,编写代码:
@admin.register(models.PrizeJoinLog)
class PrizeJoinLogAdmin(admin.ModelAdmin):
actions = ['draw_prize']
def changelist_view(self, request, extra_context=None):
try:
action = self.get_actions(request)[request.POST['action']][0]
action_acts_on_all = action.acts_on_all
except (KeyError, AttributeError):
action_acts_on_all = False
if action_acts_on_all:
post = request.POST.copy()
post.setlist(admin.helpers.ACTION_CHECKBOX_NAME,
self.model.objects.values_list('id', flat=True))
request.POST = post
return super(PrizeJoinLogAdmin, self).changelist_view(request, extra_context)
def draw_prize(self, request, queryset):
pass
draw_prize.short_description = '开始抽奖'
draw_prize.type = 'warning'
draw_prize.confirm = '确认即开始抽奖并发送中奖通知~'
draw_prize.acts_on_all = True
注意上述代码,我们添加了changelist_view这个方法,并且最后一行给draw_prize加了个属性acts_on_all 并赋值为True(无敌动态语言Python了解一下)
这样在提交的时候,changelist_view检查到action有个acts_on_all 属性,就会自动带上所有对象,相当于自动帮我们勾选了全部对象的意思。妙啊~
欢迎交流
不过这种方式感觉也不是很完美,如果大佬们有什么更好的解决方法,欢迎留言讨论~
参考资料
- https://stackoverflow.com/questions/4500924/django-admin-action-without-selecting-objects
- https://simpleui.88cto.com/docs/simpleui/QUICK.html#%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8C%89%E9%92%AE-action
给Django的Admin添加自定义Action 并移除需要选择对象的限制的更多相关文章
- 自定义django的admin后台action
django的admin后台管理系统中自带了一个批量删除所选对象的action. 我们还可以添加自定义的action来实现其它类似的功能,如批量修改某个字段的功能.简单的,例如将文章批量标记为已发布的 ...
- django后台管理--添加自定义action
管理员动作 简单来说,Django管理员的基本工作流程是“选择一个对象,然后进行更改”.这对大多数用例都很有效. 然而当你一次性要对多个对象做相同的改变,这个流程是非常的单调乏味的. 在这些情况下,D ...
- django自定义Admin actions
通常情况下,admin的工作模式是“选中目标,然后修改目标”,但在同时修改大量目标的时候,这种模式就变得重复.繁琐. 为此,admin提供了自定义功能函数actions的手段,可以批量对数据进行修改. ...
- 【django之admin,单例模式】
一.admin组件使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.你可以在项目的 settings.py 中的 INSTAL ...
- Django之admin的使用和源码剖析
admin组件使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.你可以在项目的 settings.py 中的 INSTALLE ...
- Django 之 admin管理工具
-------------------------------------------------------------------------妄尝恶果,苦果自来. admin组件使用 Django ...
- python框架之Django(13)-admin组件
使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.你可以在项目的 settings.py 中的 INSTALLED_APPS ...
- stark组件之批量操作【模仿Django的admin】
一.先看下django的admin是如何实现批量操作 首先在配置类中定义一个函数 然后我们为这个函数对象设置一个属性,这个属性主要用来显示在select标签中显示的文本内容 最后把函数对象放到一个ac ...
- django之admin设置
Django自带的后台管理是Django明显特色之一,可以让我们快速便捷管理数据.后台管理可以在各个app的admin.py文件中进行控制.以下是我最近摸索总结出比较实用的配置.若你有什么比较好的配置 ...
随机推荐
- flask的第一次尝试
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return "Hello ...
- Django学习路19_is_delete属性,重写类方法,显性隐性属性
如果在 创建数据表时,使用了 objects = models.Model() 使隐形属性变为了 显性属性 则 必须要自己定义一个 继承了 models.Model 类的类,实现 管理功能 如果一个属 ...
- functools 中的 reduce 函数基本写法
reduce 返回的往往是一整个可迭代对象的 操作结果 reduce(函数,可迭代对象) 注:lambda x,y 两个参数 2020-05-04
- Python long() 函数
描述 long() 函数将数字或字符串转换为一个长整型.高佣联盟 www.cgewang.com 语法 long() 函数语法: class long(x, base=10) 参数 x -- 字符串或 ...
- Python os.utime() 方法
概述 os.utime() 方法用于设置指定路径文件最后的修改和访问时间.高佣联盟 www.cgewang.com 在Unix,Windows中有效. 语法 utime()方法语法格式如下: os.u ...
- PHP imagechar - 写出横向字符
imagechar — 写出横向的字符.高佣联盟 www.cgewang.com 语法 bool imagechar ( resource $image , int $font , int $x , ...
- CF EC 86 E Placing Rooks 组合数学
LINK:Placing Rooks 丢人现场.jpg 没看到题目中的条件 放n个rook 我以为可以无限放 自闭了好半天. 其实只用放n个.那么就容易很多了. 可以发现 不管怎么放 所有列/所有行 ...
- mysql 常用的数据类型
数字类: 整数 tinyint smallint mediumint int bigint 浮点类:float double 定点类:decimal(M,D) 日期 ...
- JVM系列之:从汇编角度分析Volatile
目录 简介 重排序 写的内存屏障 非lock和LazySet 读的性能 总结 简介 Volatile关键字对熟悉java多线程的朋友来说,应该很熟悉了.Volatile是JMM(Java Memory ...
- 蓝奏云数值验证码识别,python调用虹鱼图灵识别插件,超高正确率
识别验证码一直是本人想要做的事情,一直在接触按键精灵,了解到有一个虹鱼图灵识别插件专门做验证码和图像识别,原理就是图片处理和制作字库识别,制作字库我一直觉得很麻烦,工程量太大.不管怎样,它能用能达到我 ...