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