导语:这是全网第一篇写这方面的文章吧?捂脸,我表示我查找了好久的博客都找不到,官网也没有!喜欢就收藏关注下吧,一起学习!!
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)
如图:
image3.保存代码执行后结果如图:
image4.当然我们接下来修改下消息提醒的颜色:
只需要在av.message_user(msg)
中添加一个参数即可:
也就是av.message_user(msg,'success')
如图:
image这就是success
的消息提醒颜色,默认不设置这个参数的话是info
颜色,如上一个步骤图显示那样,
还有另外的2种颜色,warning
和error(黄色和红色)
上面的方式是无论你添加什么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做不同的人性化的消息提醒,
结语:第一次在这里放文章,如果其他博客有的文章我就不发了,主要是为了填补网上博客或者百度谷歌中没讲到难找到的地方
网友评论