【django】自定義列表 models欄位顯示
自定義列表
參考:http://docs.30c.org/djangobook2/chapter06/
自定義Author模組的列表中的顯示欄位。 列表預設地顯示查詢結果中物件的__unicode__()。 我們定義Author物件的__unicode__()方法,用以同時顯示作者的姓和名。
class Author(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=40) email = models.EmailField(blank=True, verbose_name='e-mail') **def __unicode__(self):** **return u'%s %s' % (self.first_name, self.last_name)**
結果正如圖,列表中顯示的是每個作者的姓名。
我們可以在這基礎上改進,新增其它欄位,從而改變列表的顯示。 這個頁面應該提供便利,比如說:在這個列表中可以看到作者的郵箱地址。如果能按照姓氏或名字來排序,那就更好了。
為了達到這個目的,我們將為Author模組定義一個ModelAdmin類。 這個類是自定義管理工具的關鍵,其中最基本的一件事情是允許你指定列表中的欄位。 開啟admin.py並修改:
from django.contrib import admin from mysite.books.models import Publisher, Author, Book class AuthorAdmin(admin.ModelAdmin): list_display = ('first_name', 'last_name', 'email') #新增欄位顯示 search_fields = ('first_name', 'last_name') #新增快速查詢欄 admin.site.register(Publisher) # admin.site.register(Author) admin.site.register(Author,AuthorAdmin)
解釋一下程式碼:
我們新建了一個類AuthorAdmin,它是從django.contrib.admin.ModelAdmin派生出來的子類,儲存著一個類的自定義配置,以供管理工具使用。 我們只自定義了一項:list_display, 它是一個欄位名稱的元組,用於列表顯示。 當然,這些欄位名稱必須是模組中有的。
新增一個快速查詢欄。 向AuthorAdmin追加search_fields
我們修改了admin.site.register()呼叫,在Author後面添加了AuthorAdmin。你可以這樣理解: 用AuthorAdmin選項註冊Author模組。
admin.site.register()
函式接受一個ModelAdmin子類作為第二個引數。 如果你忽略第二個引數,Django將使用預設的選項。Publisher和Book的註冊就屬於這種情況。
弄好了這個東東,再重新整理author列表頁面,你會看到列表中有三列:姓氏、名字和郵箱地址。 另外,點選每個列的列頭可以對那列進行排序。並且在頁面頂端看到一個查詢欄。
PS:
list_display = ('first_name', 'last_name', 'email') #新增欄位,以列表顯示,not a ManyToManyField
search_fields = ('first_name', 'last_name') #頁面新增查詢欄
list_filter = ('publication_date',) #新增過濾(這裡是過濾日期)
date_hierarchy = 'publication_date' #過濾(日期的另外一種過濾方式,可以新增後看一下)
ordering = ('-publication_date',) #排序(這裡以日期排序,加‘-’表示降序)
fields = ('title', 'authors', 'publisher') #排除一些不想被其他人編輯的fields(不包含在內的不能編輯,這裡publication_date不能編輯了)
filter_horizontal = ('authors',) #從‘多選框’的形式改變為‘過濾器’的方式,水平排列過濾器,must
be a ManyToManyField,且不能用於 ForeignKey欄位,預設地,管理工具使用``
下拉框`` 來展現`` 外來鍵`` 欄位
filter_vertical
= ('authors',) #同上,垂直排列過濾器
raw_id_fields
= ('publisher',) #將ForeignKey欄位從‘下拉框’改變為‘文字框’顯示