教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢/投訴熱線:400-618-4000

Django中提供的常用列表頁(yè)選項(xiàng)

更新時(shí)間:2022年03月18日11時(shí)18分 來(lái)源:傳智教育 瀏覽次數(shù):

Django提供了一些選項(xiàng)來(lái)控制列表頁(yè)的顯示字段、搜索字段、過(guò)濾器等等,這些選項(xiàng)在應(yīng)用的admin.py文件的模型管理類(lèi)中使用。接下來(lái)以Goods模型為例,對(duì)常用列表頁(yè)選項(xiàng)進(jìn)行介紹。

1. list_display 選項(xiàng)

list_display 選項(xiàng)用于控制頁(yè)面展示的字段,該選項(xiàng)的值為元組或列表類(lèi)型,其中的元素可以是模型字段或自定義字段。

(1)模型字段名

使用list_display控制在頁(yè)面中顯示商品id和商品名稱,示例如下:

list_display = ('id', 'name')                #元組形式
list_display = ['id', 'name']                #列表形式

(2)自定義字段

自定義字段指與模型相關(guān),但并不包含在模型中的字段,這種字段是定義在goods/admin.py文件中的一些函數(shù),這些函數(shù)會(huì)將模型實(shí)例作為參數(shù)。

例如,在goods/admin.py文件中定義用于顯示商品銷(xiāo)售額的自定義字段“salves_volume”,并使用sales_volume.short_description 設(shè)置該字段的功能說(shuō)明。示例代碼如下:

from .models import Goods
g = Goods()
def sales_volume(g):
  salea = g.price * g.sales
  return"{銷(xiāo)售額為:{}元".foxmat(g.name,sales)
sales_volume.short_description='商品銷(xiāo)售額'

以上代碼首先實(shí)例化模型類(lèi)Goods,然后將實(shí)例化的模型類(lèi)作為參數(shù)傳遞到定義的salves_volumeO函數(shù)中計(jì)算商品銷(xiāo)售額。

使用list_display 選項(xiàng)控制顯示salves_volume字段,代碼如下:

(admin.register(Goods)
class GoodsAdmin(admin.ModelAdmin):
list_display = (sales_volume,)

以上代碼在應(yīng)用的admin.py文件中定義了Goods模型的管理類(lèi)GoodsAdmin,在該類(lèi)中通過(guò) list_display 選項(xiàng)指定要顯示的字段。

此時(shí),刷新數(shù)據(jù)列表,可查看自定義字段顯示的數(shù)據(jù),如下圖所示。

list_display 選項(xiàng)

2. list_display_links選項(xiàng)

list_display_links選項(xiàng)用于設(shè)置需在頁(yè)面中以鏈接形式展示的字段,例如:

list_display_links = ('id', 'name')

此時(shí)頁(yè)面中的id和name字段將以鏈接形式展示,如下圖所示。

list_display_links選項(xiàng)

單擊圖6-14中商品列表部分id字段或name字段中的鏈接,可進(jìn)入相應(yīng)記錄的編輯頁(yè)面。

3.list_filter選項(xiàng)

list_filter選項(xiàng)用于開(kāi)啟列表頁(yè)過(guò)濾器,該選項(xiàng)可以接收模型中的字段作為過(guò)濾條件,也可接收自定義過(guò)濾器。

(1)按模型字段進(jìn)行過(guò)濾

以Goods模型為例,使用list_filter設(shè)置在頁(yè)面中以商品名稱作為過(guò)濾條件,示例如下:

list_filter = ('name',)                         # 以name作為過(guò)濾字段

列表頁(yè)的過(guò)濾器會(huì)在頁(yè)面右側(cè)展示,如圖所示:

list_filter選項(xiàng)

(2)自定義過(guò)濾器

list_filter也支持自定義過(guò)濾器。Goods模型的數(shù)據(jù)根據(jù)商品名稱可分為“Apple Mac Pro”、“Apple iPhone”、“華為”和“小米”四種類(lèi)別,下面自定義根據(jù)商品類(lèi)別進(jìn)行篩選的過(guò)濾器。

自定義過(guò)濾器本質(zhì)上是一個(gè)類(lèi),該類(lèi)需要繼承admin.SimpleListFilter類(lèi),并重寫(xiě)lookups()與queryset()方法,其中l(wèi)ookups()方法用于設(shè)置分類(lèi),queryset()方法用于查詢分類(lèi)數(shù)據(jù)。在admin.py中自定義過(guò)濾器類(lèi),示例代碼如下:

class BrandListFilter(admin.SimpleListFilter):
title='商品名稱'
parameter_name = 'brand_name'
def lookupa(self, request, model_admin):
   return (
     ('0', ('Apple MacBook Pro')),
     ('1', ('Apple iPhone')),
    ('2',('華為')),
    (*3’,(‘小米’)),
  )
def queryset(self, request, queryset):
   if self.value() == '0':
      return queryset.filter(name__istartswith='Apple MacBook Pro')
   if self.value() == '1':
      return queryset.filter(name__istartswith='Apple iPhone')
   if self.value() == '2':
      return queryset.filter(name__istartswith='華為')

以上代碼定義的自定義過(guò)濾器中,類(lèi)屬性title表示列表頁(yè)上過(guò)濾器的名稱,類(lèi)屬性 parameter_name表示訪問(wèn)路由中所攜帶的參數(shù)名稱;looksupsO方法返回一個(gè)二維元組,內(nèi)層元組中的第一個(gè)元素是字符串類(lèi)型的查詢編號(hào),第二個(gè)元素是過(guò)濾器類(lèi)別名稱元組;querysetO方法根據(jù)查詢編號(hào)進(jìn)行篩選,返回一個(gè)QuerySet對(duì)象。

在模型管理器中將自定義的過(guò)濾器添加到list_filter,示例如下:

class GoodsAdmin(admin.ModelAdmin):
‥‥
list_filter = (BrandListEilter,)

刷新選擇商品來(lái)修改頁(yè)面,可看到自定義的過(guò)濾器,具體如圖6-16所示。

自定義的過(guò)濾器

4.list_per_page選項(xiàng)

選擇商品來(lái)修改頁(yè)面默認(rèn)每頁(yè)顯示100條數(shù)據(jù),使用list_per_page選項(xiàng)可以設(shè)置每頁(yè)顯示的數(shù)據(jù)量。例如,設(shè)置每頁(yè)顯示5條記錄,示例如下:

list_per_page = 5 # 每頁(yè)展示5條記錄
刷新選擇商品來(lái)修改頁(yè)面,此時(shí)頁(yè)面效果如圖6-17所示。
list_per_page選項(xiàng)
圖6-18設(shè)置可編輯字段數(shù)據(jù)編輯完畢后,下拉到頁(yè)面底部,單擊“保存”按鈕可保存修改后數(shù)據(jù)。

6.search_fields選項(xiàng)

search_fields選項(xiàng)用于配置搜索字段,示例代碼如下:

search_fields = ('name',)#           表示以name作為搜索字段
以上代碼設(shè)置在選擇商品來(lái)修改頁(yè)面以商品名稱做為搜索條件,此時(shí)刷新頁(yè)面,頁(yè)面中將出現(xiàn)一個(gè)搜索框,具體效果如圖6-19所示。 
search_fields選項(xiàng)

7.actions_on_top選項(xiàng)

actions_on_top選項(xiàng)用于設(shè)置是否在頂部顯示動(dòng)作下拉框,默認(rèn)為T(mén)rue,表示在頂部顯示,效果如圖6-20所示。

圖6-20默認(rèn)效果修改actions_on_top選項(xiàng)為Flase,那么頁(yè)面頂部不會(huì)再顯示動(dòng)作,代碼如下:

actions_on_top = False
保存設(shè)置,刷新頁(yè)面,效果如圖6-21所示。

actions_on_top選項(xiàng)

8.actions_on_bottom選項(xiàng)

actions_on_bottom選項(xiàng)用于設(shè)置管理員動(dòng)作是否在底部顯示,默認(rèn)為False,表示不在底部顯示,當(dāng)設(shè)置為T(mén)rue表示在底部顯示。

9.actions選項(xiàng)

actions選項(xiàng)用于設(shè)定管理員動(dòng)作。列表頁(yè)默認(rèn)提供“刪除所選”動(dòng)作,管理員選定商品后選擇“刪除所選”動(dòng)作,再單擊“執(zhí)行”按鈕,選定的商品會(huì)被刪除。a

ctions選項(xiàng)也支持自定義管理員動(dòng)作。自定義管理員動(dòng)作的本質(zhì)是在管理類(lèi)中新增一個(gè)方法,并將該方法添加到actions選項(xiàng)中。例如,現(xiàn)需要將圖6-21中的商品數(shù)據(jù)保存到Excel文件中,此時(shí)可在admin.py文件中定義下載商品信息動(dòng)作。具體代碼如下:

from django.http import HttpResponse
from django.utils.encoding import escape_uri_path
from openpyxl import Workbook
@admin.register (Goods)
class GoodsAdmin(admin.ModelAdmin):
    ...
    def download_excel(self, request, queryset):
        file_name='商品信息.xlsx'
        meta = self.model._meta
        #模型所有字段名
        field_names = [field.name for field in meta.fields]
        ≠定義響應(yīng)內(nèi)容類(lèi)型
        response = HttpResponse(content_type='application/msexcel')
        #定義響應(yīng)數(shù)據(jù)格式
        response['Content-Disposition'] = attachment;
        filename*=utf-8''{}.format(escape_uri_path(file_name))
        wb=workbook#創(chuàng)建文件對(duì)象
        ws= wb.active#使用當(dāng)前活動(dòng)的sheet表
        ws.append(['ID',‘創(chuàng)建時(shí)間,,‘更新時(shí)間','商品名稱,
                  價(jià)格,,·庫(kù)存,,·銷(xiāo)量’])    #將模型字段名作為標(biāo)題寫(xiě)入第一行
        for obj in queryset:                 #遍歷選擇的對(duì)象列表
           for field in field_names:
           #將模型屬性值的文本格式組成列表
           data = [getattr(obj, field) for field in field_names]
        ws.append(data)    #寫(xiě)入模型屬性值
        wb.save (response) #將數(shù)據(jù)存入響應(yīng)內(nèi)容
        return response
download_excel.short_description="下載商品信息"

以上示例代碼在GoodsAdmin類(lèi)中定義了方法download_excel()來(lái)實(shí)現(xiàn)“下載商品信息”的功能,該方法通過(guò)openpyxl模塊將列表頁(yè)中的商品數(shù)據(jù)寫(xiě)入到Excel文件中,如果當(dāng)前Python環(huán)境中沒(méi)有此模塊,可使用pip命令進(jìn)行安裝。使用openpyxl模塊時(shí)需先創(chuàng)建文件對(duì)象;然后通過(guò)文件對(duì)象的active屬性獲取Excel文件中的Sheet表,通過(guò)append()方法將標(biāo)題行寫(xiě)入到excel文件;最后使用save()方法保存寫(xiě)入的數(shù)據(jù)。

download_excel()方法定義完成后,將其添加到actions選項(xiàng)中,示例如下:

actions = (download_excel,)

再次刷新選擇商品來(lái)修改頁(yè)面,在動(dòng)作下拉框中可以看到自定義的動(dòng)作已被添加,如圖6-22所示。

actions選項(xiàng)

單擊圖6-22中的“執(zhí)行”按鈕下載所選商品信息,打開(kāi)下載的Excel文件,保存的商品信息如圖6-23所示。

actions選項(xiàng)






猜你喜歡:

Python怎樣添加、刪除、修改列表元素?

文本數(shù)據(jù)分析有什么作用?

什么是交叉驗(yàn)證?什么是網(wǎng)格搜索?

機(jī)器學(xué)習(xí)中入門(mén)級(jí)必學(xué)的算法有哪些?

傳智教育人工智能開(kāi)發(fā)課程

0 分享到:
和我們?cè)诰€交談!