[Python+Django]初心者筆記5(建立應用程式的admin管理介面的"進階版",清單的顯示順序用list_display,清單過濾器Add list filters,fields,fields排版編輯畫面,fieldsets排版編輯畫面,inlines同時編輯兩個資料表)

[Python+Django]初心者筆記5(建立應用程式的admin管理介面的"進階版",清單的顯示順序用list_display,清單過濾器Add list filters,fields,fields排版編輯畫面,fieldsets排版編輯畫面,inlines同時編輯兩個資料表)

Django framework特別提供了管理者介面的"進階版"!既然他特別提供了,我們就來介紹一下囉~

從locallibrary/catalog/admin.py檔案的改寫開始:

from django.contrib import admin

# Register your models here.

from .models import Author, Genre, Book, BookInstance, Language


#admin.site.register(Author)
# admin.site.register(Book)
# admin.site.register(BookInstance)
admin.site.register(Genre)
admin.site.register(Language)

################################################################
#自行練習Author + BookInline的同時編輯
class BookInline(admin.TabularInline):
    model = Book
    extra = 1
################################################################


#以下有進階的admin作法
#首先從Author開始

################################################################
#AuthorAdmin:Author的admin的進階作法
# Define the admin class
class AuthorAdmin(admin.ModelAdmin):
    #list_display:是用來overwrite Author類別的__str__(self)函式的
    #原本__str__(self)只是用來顯示lastname + firstname而已
    #現在改寫成lastname, firstname, date_of_birth, date_of_death
    list_display = ('last_name', 'first_name', 'date_of_birth', 'date_of_death')
    
    #fields:
    #用來基本客製化顯示的欄位的順序(編輯資料時)
    #預設的系統排列方式,是垂直的一個一個欄位顯示
    #以下的方式,就可以把date_of_birth, date_of_death放在同一列
    fields = ['first_name', 'last_name', ('date_of_birth', 'date_of_death')]

    #pass表示AuthorAdmin不變更原本Author類別的行為
    #當不打算變更原本Author類別的行為的時候,寫pass就可以了
    # pass

    #自行練習Author + BookInline的同時編輯
    inlines = [BookInline]


# Register the admin class with the associated model
admin.site.register(Author, AuthorAdmin)
################################################################


################################################################
#BooksInstanceInline:
#這是讓Book可以同時跟BooksInstance
#被編輯的大絕招,不用像以前那樣,自己要把Book跟BookInstance的PK關連起來才能顯示
class BooksInstanceInline(admin.TabularInline):
    model = BookInstance
    extra = 1
################################################################

################################################################
#BookAdmin:
# Register the Admin classes for Book using the decorator

#補充:@admin.register跟admin.site.register完全一模一樣的功用
@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    #這裡也是overwrite Book類別的__str__()函式
    #只是這裡有個foreign key是genre圖書種類,我們採用呼叫Book類別裡面的
    #method:display_genre()組合字串來顯示這個foreign key物件
    #而由於Book與Genre類別的關係是many to many
    #所以display_genre()自動把中介資料表junction table這部分,自動作掉了
    #算是Django framework優秀的地方
    list_display = ('title', 'author', 'display_genre')    

    #BooksInstanceInline:
    #這是讓Book可以同時跟BooksInstance
    inlines = [BooksInstanceInline]    
    #pass

################################################################


################################################################
#BookInstanceAdmin:
# Register the Admin classes for BookInstance using the decorator

@admin.register(BookInstance) 
class BookInstanceAdmin(admin.ModelAdmin):    
    #pass
    list_display = ('book', 'status', 'due_back')   
    #在畫面旁邊加入過濾條件的欄位
    list_filter = ('status', 'due_back')

    #fieldsets:
    #用來進階客製化的欄位排序以及大標題(大標題可以為空)(編輯資料時)
    fieldsets = (
        (None, {
            'fields': ('book', 'imprint', 'id')
        }),
        ('Availability', {
            'fields': ('status', 'due_back')
        }),
    )
    
################################################################    

補充list_filter()在畫面右方出現過濾條件畫面:

補充fields屬性用來排版欄位順序的畫面:


補充fieldsets屬性用來排版欄位順序的畫面:

利用inline屬性,同時編輯Book物件以及BookInstance物件:


參考資料:
[Python+Django]初心者筆記4(建立應用程式的admin管理介面)
https://dotblogs.com.tw/kevinya/2018/06/27/104953
Django Tutorial Part 4: Django admin site
https://dotblogs.com.tw/admin/blogcontents/create