zoukankan      html  css  js  c++  java
  • 给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 属性,就会自动带上所有对象,相当于自动帮我们勾选了全部对象的意思。妙啊~

    欢迎交流

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

    参考资料

  • 相关阅读:
    .net Remoting学习笔记(一) 中庸
    培训是一种乐趣(2)
    ExtJS实战(10)项目总结
    ExtJS实战(4)struts
    ExtJS实战(7)登陆
    ExtJS实战(5)dwr
    让老师崩溃的回答-程序员的经典笑话
    ExtJS实战(9)疑难杂症分析
    ExtJS实战(6)extjs+json
    ExtJS实战(8)CRUD+分页+复杂查询+排序
  • 原文地址:https://www.cnblogs.com/deali/p/13566962.html
Copyright © 2011-2022 走看看