深入admin之chang_list

  admin应用的一个最主要的视图是change_list,是ModelAdmin的一个名为changelist_view的函数。不过需要ModelAdmin的其他全局变量和成员函数来配合,最主要的设计变量和函数是主要有以下几个:

        变量:

         ordering,list_display   ,list_editable,change_list_template,actions等

        函数:

         get_changelist,get_changelist_form,get_paginator,queryset等

 

       大家可以看看源文件(/django/contrib/admin/options.py)

      

      change_list视图看起来像下面那样:

      

      这里涉及到很多的知识面,一般默认的话对我们来说基本够用了。但有时候还是比较不足之处,但具体怎么做呢?在你的yourModelAdmin里面,可以重载ModelAdmin的函数和变量。一些常用的就不说了,大家可能已经知道了,官方文档也写的比较详细。主要讲讲actions,queryset:

     1. actions。actions是一个list,它们在change_list里面专门用来处理所选记录的操作。admin应用中有默认的一个action,就是删除。当然也可以自己添加action,怎么做能?还是直接看代码例子,比较清楚:

        

         这个看上去应该很明白了吧,不需要说多少了。值得说明一下的是函数当中request,queryset。

        request,应该很明白,每个django的view都有一个request,这个request实际上是从changelist_view视图中传递过来的,而queryset是根据用户选择的记录当中的一个queryset集合。界面的样子是这样的:

       

       方便吧!不过这里没有删除的action,不要误会,因为在这个例子当中,删除用户是我不希望做的。所以我把删除用户的action屏蔽掉了。怎么样屏蔽这个action呢?主要有两种方法,第一种就是在ModeAdmin里面有个一个函数:get_actions,它返回一个actions的列表,在yourModelAdmin里面重载一下。代码如下:

      

     这个应该很清楚了,先调用父类返回一个actions,然后在actions里面找到删除的action,删除它,并返回删除后的actions。

     另一种方法是在你的admin.py里面添加admin.site.disable_action('delete_selected')这句就可以完成。但这个有很大的问题,看这条语句就明白它是对整个site来说的,也就是说你在任何一个admin.py里面加上这么一句,整个站点的所有app应用当中都没有删除的action了,所以要想好了再选择用哪种方式来做。

       这里值得一提的是:这个actions可以有很好的发展,在很多web应用系统当中,往往会遇到这样一种情节,比如说:

         yourModelAdmin的actions=['action1','action2'],业务的流程告诉你一部分的用户只有具备action1,一部分的用户只有具备action2,另外一部分的用户都具备,还有一部分的用户都不具备任何actions。这样一来,每个用户的actions的情况是不一样的,但都不要紧,get_actions函数可以帮你搞定。看例子:

          

         代码不用解释了吧,当然也有其他的方法,只要能实现就可以了。但我觉得这样的写法比较合适,不同习惯而已。在速度上可能也比较占优优势。毕竟父类执行get_actions函数时,数据的大小在执行速度上应该会有所不同。

 

        2.queryset:

          在WEB应用系统中,你很有可能会涉及数据权限的问题。比方说:同样大家都有添加数据的权限,但要在chang_list里面只能看到自己添加的记录,其他人的记录是不能够被看到的。这样情况就要靠queryset函数了。在默认的情况下,queryset返回的是整个Model记录。重载它可以帮组解决:

          def queryset(self,request) :

               qs = youModel.objects.filter(.....)

               return qs 

           这样起到了安全作用,数据安全性。


           如果你要在change_list里面添加额外的数据,可以通过重载changelist_view视图和自定义change_list.html的模板来做。大致的做法是

         def changelist_view(self, request, extra_context=None):

                     extra_context = {'变量名':'值',..........}

                     return super(yourModelAdmin,self).changelist_view(request,extra_context)

        自定义模板:

        change_list_template = ‘admin/yourapp/change_list_custom.html’

        在/yourProject/yourApp/templates/yourapp_name/目录下创建一个名为change_list_custom.html文件,但一些重要的数据对象名都要参考它自己的,毕竟从视图传入到模板的对象数据名是由视图决定的。

原文地址:https://www.cnblogs.com/lhj588/p/2516069.html