曦远 (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 许可协议。转载请注明出处!

相关文章

配置Django-TinyMCE组件支持上传图片功能

Django自带的Admin后台,好用,TinyMCE作为富文本编辑器,也蛮好用的,这两者结合起来在做博客的时候很方便(当然博客可能更适合用Markdown来写),但是Django-TinyMCE这个组件默认没有图片上传功能的,需要我们自己实现,本文将一步步带大家实现这个图片上传功能。 读者也可以举一反三实现其他需要和Django结合的功能。 编写上传图片逻辑 在任一views.py里添加代码:

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

Django项目笔记:sessions处理以及复杂对象序列化

前言:一点题外话 我发现,不更新博客的时候,不是非常忙,就是效率非常低。最近没怎么更新博客,原因是第二种= =。惭愧惭愧。 今天效率出奇的高,一天时间把PassNote后端的接口全部写完了,Django很好用,不过实际项目中还是有些框架不能实现的功能需要解决的,我比较喜欢造轮子,不过为了保证效率,还是尽量用现成的工具,减少不必要的折腾。 关于PassNote 之前应该在博客有说过,这是一个密码管理

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

Django应用部署:Docker容器化实践

在此之前,我一直用uwsgi+virtualenv+nginx方式进行应用部署,操作起来比较麻烦,而且依赖于服务器上的Python版本,服务的管理方面单纯uwsgi + pid算不上特别麻烦但总没有docker compose方便,无奈原本的服务器是32位系统的用不上docker,现在又增加了一个新服务器,所以赶紧把docker安排上~ 不得不说真的太简单太方便了,全程傻瓜式操作,也基本没像之前u

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

讨论

共 0 条

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

加载评论中…