Django的MdoelAdmin有一些全局变量,都是非常关键的,其中一个变量就是list_display。它的默认值:('__str__',),也可以是('__unicode__',);从这个可以看出list_display是一个列表,作用是设置admin的change_list页面显示model纪录的字段,所以list的值是model的字段。但在实际的业务流程中是不能够满足要求的,比如显示销售职员的总销量,这个销量数据是在另一个销量model(Sales)里,是需要动态计算而出;像这样的情况,Django给出了一个方法:

点击(此处)折叠或打开

  1. class XXXAdmin(admin.ModelAdmin) :
  2.     list_display = ('username','get_user_sales')
  3.     def get_user_sales(self,obj) :
  4.         numbers = 0
  5.         for sale in  Sales.objects.filter(user=obj) :
  6.             numbers += sale.number
  7.         return numbers
  8.     get_user_sales.short_description = u'累计销量'

其中obj就是当前model的object。
list_display变量还有一个对应方法:get_list_display(self,request),源代码:

点击(此处)折叠或打开

  1. def get_list_display(self, request):
  2.         """
  3.         Return a sequence containing the fields to be displayed on the
  4.         changelist.
  5.         """
  6.         return self.list_display

只有一条返回语句,返回全局变量list_display。在其它地方需要使用到这个list_diaplay变量,都是调用这个函数的。为什么不直接调用全局变量呢?会不会是多此一举呢?其实Django给了我们更大的发展空间,试想一下:一个model可能有很多的字段,但不可能全部显示出来,这样页面肯定不好看,而且不同的用户对字段的侧重点是不同的。所以有了get_list_display这个方法就可以实现不同的用户可以显示不同的字段。比如:

点击(此处)折叠或打开

  1. def get_list_display(self, request):
  2.         """
  3.         Return a sequence containing the fields to be displayed on the
  4.         changelist.
  5.         """
  6.         if request.user == 'A' :
  7.             self.list_display = ('AA','AB','AC')
  8.         else :
  9.             self.list_display = ('AA','AB')
  10.         return self.list_display

发表评论

邮箱地址不会被公开。 必填项已用*标注