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

全國咨詢/投訴熱線:400-618-4000

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

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

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

1. list_display 選項(xiàng)

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

(1)模型字段名

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

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

(2)自定義字段

自定義字段指與模型相關(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 選項(xiàng)

2. list_display_links選項(xiàng)

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

list_display_links = ('id', 'name')

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

list_display_links選項(xiàng)

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

3.list_filter選項(xiàng)

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

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

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

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

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

list_filter選項(xiàng)

(2)自定義過濾器

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所示。

自定義的過濾器

4.list_per_page選項(xiàng)

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

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

6.search_fields選項(xiàng)

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

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

7.actions_on_top選項(xiàng)

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_top選項(xiàng)

8.actions_on_bottom選項(xiàng)

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

9.actions選項(xiàng)

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所示。

actions選項(xiàng)

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

actions選項(xiàng)






猜你喜歡:

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

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

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

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

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

0 分享到:
和我們在線交談!