1. 程式人生 > >【django】自定義列表 models欄位顯示

【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將使用預設的選項。PublisherBook的註冊就屬於這種情況。

弄好了這個東東,再重新整理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欄位從‘下拉框’改變為‘文字框’顯示