曦远 (DealiAxy)一份私人的文字刊物

StarBlog
返回文章列表折页手记阅读全文
Django

给Django的Admin添加自定义Action-并移除需要选择对象的限制

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

曦远 (DealiAxy)约 7 分钟
目录7 个章节

前言

不得不说,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 属性,就会自动带上所有对象,相当于自动帮我们勾选了全部对象的意思。妙啊~

欢迎交流

不过这种方式感觉也不是很完美,如果大佬们有什么更好的解决方法,欢迎留言讨论~

参考资料

欢迎交流

我整理了一系列的技术文章和资料,在公众号「程序设计实验室」后台回复 linux、flutter、c#、netcore、android、kotlin、java、python 等可获取相关技术文章和资料,同时有任何问题都可以在公众号后台留言~

_EOF_

给Django的Admin添加自定义Action-并移除需要选择对象的限制

本文作者:
程序设计实验室
版权声明:
本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

相关文章

一小时完成后台开发:DjangoRestFramework开发实践

DjangoRestFramework开发实践 在这之前我写过一篇关于Django与Drf快速开发实践的博客,Django快速开发实践:Drf框架和xadmin配置指北,粗略说了一下Drf配置和基本使用,不过里面只是涉及到最基本的CRUD,在正常的后端开发中涉及的诸如认证和权限、消息队列、缓存之类的操作,上一篇博客并没有涉及,这次开发我仔细了看了官方文档的这几个部分,把这部分的功能完善了起来。 D

2021-12-18 · Django · 约 1 分钟

Django-Import-Export插件关于外键的处理

前言 Django-Import-Export是一款很好用很方便的Django数据导出导入插件,可以和DjangoAdmin管理后台完美集成,只需要少量的代码配置即可方便实现你要的多种格式导出导入,关于这个插件的使用更多可以看我之前的文章:这里放文章链接 之前我在使用中都是专门做了一个原始数据的表来存导入的数据,然后再对原始数据表做一些数据处理,把数据存到其他表才能真正使用这些数据。(不是很好的做

2022-04-02 · Django · 约 1 分钟

讨论

共 0 条

良言一句三冬暖,恶语伤人六月寒。

加载评论中…