python+django2+admin+xadmin2

Django xadmin中实现actions修改后和admin

2019-03-25  本文已影响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做不同的人性化的消息提醒,

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

上一篇 下一篇

猜你喜欢

热点阅读