更新時間:2022年03月18日11時18分 來源:傳智教育 瀏覽次數(shù):
Django提供了一些選項(xiàng)來控制列表頁的顯示字段、搜索字段、過濾器等等,這些選項(xiàng)在應(yīng)用的admin.py文件的模型管理類中使用。接下來以Goods模型為例,對常用列表頁選項(xiàng)進(jìn)行介紹。
list_display 選項(xiàng)用于控制頁面展示的字段,該選項(xiàng)的值為元組或列表類型,其中的元素可以是模型字段或自定義字段。
使用list_display控制在頁面中顯示商品id和商品名稱,示例如下:
list_display = ('id', 'name') #元組形式 list_display = ['id', 'name'] #列表形式
自定義字段指與模型相關(guān),但并不包含在模型中的字段,這種字段是定義在goods/admin.py文件中的一些函數(shù),這些函數(shù)會將模型實(shí)例作為參數(shù)。
例如,在goods/admin.py文件中定義用于顯示商品銷售額的自定義字段“salves_volume”,并使用sales_volume.short_description 設(shè)置該字段的功能說明。示例代碼如下:
from .models import Goods g = Goods() def sales_volume(g): salea = g.price * g.sales return"{銷售額為:{}元".foxmat(g.name,sales) sales_volume.short_description='商品銷售額'
以上代碼首先實(shí)例化模型類Goods,然后將實(shí)例化的模型類作為參數(shù)傳遞到定義的salves_volumeO函數(shù)中計算商品銷售額。
使用list_display 選項(xiàng)控制顯示salves_volume字段,代碼如下:
(admin.register(Goods) class GoodsAdmin(admin.ModelAdmin): list_display = (sales_volume,)
以上代碼在應(yīng)用的admin.py文件中定義了Goods模型的管理類GoodsAdmin,在該類中通過 list_display 選項(xiàng)指定要顯示的字段。
此時,刷新數(shù)據(jù)列表,可查看自定義字段顯示的數(shù)據(jù),如下圖所示。
list_display_links選項(xiàng)用于設(shè)置需在頁面中以鏈接形式展示的字段,例如:
list_display_links = ('id', 'name')
此時頁面中的id和name字段將以鏈接形式展示,如下圖所示。
單擊圖6-14中商品列表部分id字段或name字段中的鏈接,可進(jìn)入相應(yīng)記錄的編輯頁面。
list_filter選項(xiàng)用于開啟列表頁過濾器,該選項(xiàng)可以接收模型中的字段作為過濾條件,也可接收自定義過濾器。
以Goods模型為例,使用list_filter設(shè)置在頁面中以商品名稱作為過濾條件,示例如下:
list_filter = ('name',) # 以name作為過濾字段
列表頁的過濾器會在頁面右側(cè)展示,如圖所示:
list_filter也支持自定義過濾器。Goods模型的數(shù)據(jù)根據(jù)商品名稱可分為“Apple Mac Pro”、“Apple iPhone”、“華為”和“小米”四種類別,下面自定義根據(jù)商品類別進(jìn)行篩選的過濾器。
自定義過濾器本質(zhì)上是一個類,該類需要繼承admin.SimpleListFilter類,并重寫lookups()與queryset()方法,其中l(wèi)ookups()方法用于設(shè)置分類,queryset()方法用于查詢分類數(shù)據(jù)。在admin.py中自定義過濾器類,示例代碼如下:
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='華為')
以上代碼定義的自定義過濾器中,類屬性title表示列表頁上過濾器的名稱,類屬性 parameter_name表示訪問路由中所攜帶的參數(shù)名稱;looksupsO方法返回一個二維元組,內(nèi)層元組中的第一個元素是字符串類型的查詢編號,第二個元素是過濾器類別名稱元組;querysetO方法根據(jù)查詢編號進(jìn)行篩選,返回一個QuerySet對象。
在模型管理器中將自定義的過濾器添加到list_filter,示例如下:
class GoodsAdmin(admin.ModelAdmin): ‥‥ list_filter = (BrandListEilter,)
刷新選擇商品來修改頁面,可看到自定義的過濾器,具體如圖6-16所示。
選擇商品來修改頁面默認(rèn)每頁顯示100條數(shù)據(jù),使用list_per_page選項(xiàng)可以設(shè)置每頁顯示的數(shù)據(jù)量。例如,設(shè)置每頁顯示5條記錄,示例如下:
list_per_page = 5 # 每頁展示5條記錄刷新選擇商品來修改頁面,此時頁面效果如圖6-17所示。
search_fields選項(xiàng)用于配置搜索字段,示例代碼如下:
search_fields = ('name',)# 表示以name作為搜索字段以上代碼設(shè)置在選擇商品來修改頁面以商品名稱做為搜索條件,此時刷新頁面,頁面中將出現(xiàn)一個搜索框,具體效果如圖6-19所示。
actions_on_top選項(xiàng)用于設(shè)置是否在頂部顯示動作下拉框,默認(rèn)為True,表示在頂部顯示,效果如圖6-20所示。
圖6-20默認(rèn)效果修改actions_on_top選項(xiàng)為Flase,那么頁面頂部不會再顯示動作,代碼如下:
actions_on_top = False保存設(shè)置,刷新頁面,效果如圖6-21所示。
actions_on_bottom選項(xiàng)用于設(shè)置管理員動作是否在底部顯示,默認(rèn)為False,表示不在底部顯示,當(dāng)設(shè)置為True表示在底部顯示。
actions選項(xiàng)用于設(shè)定管理員動作。列表頁默認(rèn)提供“刪除所選”動作,管理員選定商品后選擇“刪除所選”動作,再單擊“執(zhí)行”按鈕,選定的商品會被刪除。a
ctions選項(xiàng)也支持自定義管理員動作。自定義管理員動作的本質(zhì)是在管理類中新增一個方法,并將該方法添加到actions選項(xiàng)中。例如,現(xiàn)需要將圖6-21中的商品數(shù)據(jù)保存到Excel文件中,此時可在admin.py文件中定義下載商品信息動作。具體代碼如下:
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)容類型 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)建文件對象 ws= wb.active#使用當(dāng)前活動的sheet表 ws.append(['ID',‘創(chuàng)建時間,,‘更新時間','商品名稱, 價格,,·庫存,,·銷量’]) #將模型字段名作為標(biāo)題寫入第一行 for obj in queryset: #遍歷選擇的對象列表 for field in field_names: #將模型屬性值的文本格式組成列表 data = [getattr(obj, field) for field in field_names] ws.append(data) #寫入模型屬性值 wb.save (response) #將數(shù)據(jù)存入響應(yīng)內(nèi)容 return response download_excel.short_description="下載商品信息"
以上示例代碼在GoodsAdmin類中定義了方法download_excel()來實(shí)現(xiàn)“下載商品信息”的功能,該方法通過openpyxl模塊將列表頁中的商品數(shù)據(jù)寫入到Excel文件中,如果當(dāng)前Python環(huán)境中沒有此模塊,可使用pip命令進(jìn)行安裝。使用openpyxl模塊時需先創(chuàng)建文件對象;然后通過文件對象的active屬性獲取Excel文件中的Sheet表,通過append()方法將標(biāo)題行寫入到excel文件;最后使用save()方法保存寫入的數(shù)據(jù)。
download_excel()方法定義完成后,將其添加到actions選項(xiàng)中,示例如下:
actions = (download_excel,)
再次刷新選擇商品來修改頁面,在動作下拉框中可以看到自定義的動作已被添加,如圖6-22所示。
單擊圖6-22中的“執(zhí)行”按鈕下載所選商品信息,打開下載的Excel文件,保存的商品信息如圖6-23所示。