美文网首页python+django2+admin+xadmin2
Django xadmin中实现actions修改后和admin

Django xadmin中实现actions修改后和admin

作者: 前端无聊 | 来源:发表于2019-03-25 23:37 被阅读118次

    导语:这是全网第一篇写这方面的文章吧?捂脸,我表示我查找了好久的博客都找不到,官网也没有!喜欢就收藏关注下吧,一起学习!!

    xadmin中实现actions修改后和admin一样设置消息提醒有2种方式:一种是在针对每个action做不同的消息展示,另外一种是针对全部的action全局做统一的一致的消息展示,下面我们先来看第2种针对全局的方式:

    方式2:针对全部的action全局做统一的一致的消息展示

    我们都知道在django原生的admin中添加一个actions并且执行actions中某个action后会有提示修改成功的消息,如下:

    image image

    那么我们把admin中的代码复制到xadmin中是否会有效呢?答案是否定的!

    那么我们在xadmin中如何实现像admin那样直接在本页的上部出现一个消息提醒呢?请看下面:

    1.按照xadmin官方设置actions方法

    from xadmin.plugins.actions import BaseActionView
    class MyAction(BaseActionView):#这个方法是xadmin里面特有的
    
        action_name = "MyAction"  #: 相当于这个 Action 的唯一标示, 尽量用比较针对性的名字
    
        description = ("‘是否最近出版’置为是!")  #: 描述, 出现在 Action 菜单中, 可以使用 ``%(verbose_name_plural)s`` 代替 Model 的名字.
    
        model_perm = 'change'  #: 该 Action 所需权限
    
        # 而后实现 do_action 方法
    
        def do_action(self, queryset): # queryset 是包含了已经选择的数据的 queryset
    
            for obj in queryset:
    
                # obj 的操作
    
                rows_updated=queryset.update(is_current=1)
    
            # 返不返回 HttpResponse都可以的,不返回的话内部的xadmin会重定向到本页
    
    

    2.这样设置之后还不会出现admin那样的消息提醒,接下来我们要去xadmin/plugins/actions.py源码找到ActionPlugin类作出如下的添加即可:

    
    msg = _("修改成功 "
    
                    "啦啦啦!!!")
    
    av.message_user(msg)
    
    

    如图:

    image

    3.保存代码执行后结果如图:

    image

    4.当然我们接下来修改下消息提醒的颜色:

    只需要在av.message_user(msg)中添加一个参数即可:

    也就是av.message_user(msg,'success')

    如图:

    image

    这就是success的消息提醒颜色,默认不设置这个参数的话是info颜色,如上一个步骤图显示那样,

    还有另外的2种颜色,warningerror(黄色和红色)
    上面的方式是无论你添加什么action,即使你在adminx.py中按照django中的admin方式添加的action也会经过上面你的这种消息提醒,缺点是需要修改xadmin中的源码,优点是可以不用为每个action设置消息提醒,省功夫。

    下面我们来讲方式1:针对不同的action做不同的消息提醒

    方式1:针对不同的action做不同的消息提醒

    首先我们把上面的方式2中在xadmin源码中添加的代码去掉,否则经过下面的设置后会弹出2个消息提醒并列在页面。

    from xadmin.plugins.actions import BaseActionView
    
    class MyAction(BaseActionView):#这个方法是xadmin里面特有的
        # 这里需要填写三个属性和一个可选的属性icon
        action_name = "MyAction"  #: 相当于这个 Action 的唯一标示, 尽量用比较针对性的名字
        description = ("‘是否最近出版’置为是!")  #: 描述, 出现在 Action 菜单中, 可以使用 ``%(verbose_name_plural)s`` 代替 Model 的名字.
        model_perm = 'change'  #: 该 Action 所需权限
        icon = 'fa fa-address-book'#指定在description之前显示的小图标,可选参数,以上三个是必须参数
    
        # 而后实现 do_action 方法
        def do_action(self, queryset):
            # queryset 是包含了已经选择的数据的 queryset,也就是你打钩哪个(或者哪些)就是哪个对象(或者哪些)
            #需要注意的是queryset是一个列表,即使你只有一个对象也是用一个列表来装着
            # print(queryset)
            for obj in queryset:
                print(type(obj))
                # obj 的操作,如下,这里你可以对queryset列表中的每个book对象来进行独特的操作,也可以对整个queryset列表对象进行集体的操作
                # type(obj).objects.filter(name='流畅的python111').update(is_current=1)#切记这里的obj仅仅是queryset里面的book实例,他不是书籍的类型
                rows_updated=queryset.update(is_current=1)#集体操作,返回更新了多少行的行数
    
            # 返回或者不返回 HttpResponse对象都可以,如果不返回的话默认是重定向到原本页面
            msg = "置为‘是’修改成功 "
            self.message_user(msg, 'success')#这里的值默认是info,还有warning和error
            return HttpResponseRedirect(self.request.get_full_path())#重定向到原本请求的页面
            
    
    class MyAction222(BaseActionView):
    
        action_name = "MyAction222"
        description = ("‘是否最近出版’置为否!")
        model_perm = 'change'
        icon = 'fa fa-snowflake-o'
    
        def do_action(self, queryset):
            for obj in queryset:
                print(type(obj))
                # type(obj).objects.filter(name='流畅的python111').update(is_current=1)#切记这里的obj仅仅是queryset里面的book实例,他不是书籍的类型
                rows_updated=queryset.update(is_current=0)
            msg = "置为‘否’修改成功 "
            self.message_user(msg, 'success')
            return HttpResponseRedirect(self.request.get_full_path())#重定向到原本请求的页面
          
    
    

    别忘了在adminx.py的模型管理类中注册上面的2个类,如下:

    actions = [MyAction, MyAction222]
    
    

    我们注意到上面的action中比方式1多了个icon图标的设置,具体的图标可以到fontawesome官网去查,这是一个可选的参数,由此可知我们的actions类中又三个必须参数和一个可选的参数

    改成上面的代码那样后,我们执行下,如图:


    6.png 7.png 8.png

    上面就是全部的效果图和代码,当然消息提醒只是一种方便的方式来告诉用户更改成功还是失败,我个人比较推荐第1种方式也就是针对每个action做不同的人性化的消息提醒,

    结语:第一次在这里放文章,如果其他博客有的文章我就不发了,主要是为了填补网上博客或者百度谷歌中没讲到难找到的地方

    相关文章

      网友评论

        本文标题:Django xadmin中实现actions修改后和admin

        本文链接:https://www.haomeiwen.com/subject/wuaivqtx.html