服務端編程(八)- Django - admin 後臺管理站點 後臺操作數據庫

前言 ´・ᴗ・`

  • 本節主要講了 如何配置admin 使得我們可以利用django的可視化頁面admin 後臺操作數據庫
  • 本篇內容將會幫助你學習…
    • 1 創建後臺 超級管理員root
    • 2 admin註冊ORM模型
    • 3 admin 管理頁面的魔改
    • 4 app 操作數據庫(ORM模型)的基本思路

創建ROOT賬戶

後臺管理 首先得創立賬戶
我們在 有manage.py的目錄下 運行

python manage.py createsuperuser

其實就是利用manage.py的工具 輸入“create super user”命令而已

然後會填寫一系列信息 隨便填寫 問題不大

admin註冊ORM模型

還記得之前在setting裏面註冊過一些組件嘛:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth', # authentic 驗證
    'django.contrib.contenttypes',
    'django.contrib.sessions', # session 會話
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'catalog'
]

現在我們就開始應用admin這個app(application)

既然是管理ORM模型· 進行增刪改查CRUD 就需要先登記一下 註冊一下 於是
在/locallibrary/catalog/admin.py 也就是admin應用的設置文件裏 加上:

from django.contrib import admin
from.models import Author,Genre,Book,BookInstance

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

這樣我們就可以對四個模型book author genre bookinstance進行修改了

當然這裏劇透一下 後面admin要支持更多樣的管理方式 還需要添加一些參數

打開服務器運行吧

註冊完ORM 現在就可以運行了 Django把admin控制界面設計的工作包了

python manage.py runserver

然後 瀏覽器地址: http://127.0.0.1:8000/admin
其實就是根目錄下的/admin

我們就迎來了第一個可以看的下去的頁面:
在這裏插入圖片描述然後 我們要來添加書籍了
界面很友好 怎麼操作我就不費篇幅來講了
添加數據的要求是 至少3類書 每類書兩個以上的實例(book instance)
具體的書就是實例
書的種類就是 book
最好有幾個作者
這樣 後期玩的時候會更加開心

像我個人添加了自己看的20多本書 後面頁面就會比較好玩(有數據 頁面比較充實)

修改一下語言

有些同志會覺得原版的 默認是英語 後臺管理很藍瘦 我們可以設計成中文 就像我的頁面一樣:
在這裏插入圖片描述
setting.py 找到圖中這幾項 按我的更改就行

LANGUAGE_CODE = 'zh-hans'

# 把國際時區改爲中國時區(東八區)
TIME_ZONE = 'Asia/Shanghai'

這個問題之前講過 可能有同志忘了2333 這裏再提醒一下

進一步修改…

雖然說頁面比較友好了 其實我們還可以試着自定義一下
目前我們對於四個模型 分別拿到的是4張表
對於genre表 沒啥好改的 因爲只有一列 如圖
在這裏插入圖片描述
但是 對於 book book instance這些 記錄(record)很多,該如何篩選排序 如何添加 我們應該想顯示 我們想要的信息(列) 如下:
在這裏插入圖片描述

這就需要用到model.admin 類,當然我們是繼承 並修改參數 達到目的

# admin.site.register(Author) 這句不用了
@admin.register(Author) #這句就能實現註冊 Python的裝飾器瞭解一下
class AuthorAdmin(admin.ModelAdmin):
    list_display = ('last_name', 'first_name', 'date_of_birth', 'date_of_death')

list_display就是我們想要顯示的幾列

同樣 我們改造一下book:

在這裏插入圖片描述
你可能照葫蘆畫瓢的這麼寫:

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'genre')

但其實應該這麼寫:
首先 model.py book類 添加一個函數display_genre

    def display_genre(self):
        return ', '.join([ genre.name for genre in self.genre.all()[:3] ])

然後 我們在admin.py 這麼寫:

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'display_genre')

也就 比起直接調用genre屬性 我們用display_genre函數做了個轉手 主要是避免資源消耗 具體原因見下面

這裏注意 genre這個屬性 這個model.py book類的屬性 代表的也是數據庫中 多對多的外鍵

  • ManyToOneField 就是傳統sql裏面的外鍵foreign key的應用 類似於數學的映射 多對一 一個第一作者 有多個作品 然而 一本書只有一個 第一作者
    於是外鍵就是 在作品這方(“多”)可以引用 作者方(“一”)
    因爲作者就相當於標籤 比如 我們對一羣學生作區分 研究生 本科生 專科生 是三個標籤 但是學生有千千萬萬 於是我們學生的表格就應該引用 只有三個標籤(應該是標籤表中的記錄)
    同樣 我們給書打標籤 也是如此
  • OneToManyField 就是前者 多對一 反過來就行
  • ManyToManyField 多對多 這是外鍵的拓展 一本書可以已有多個領域分類(genre) 而一個領域分類肯定包含多本書

對數據庫而言 本身底層是沒有“多對多”的 外鍵主要是多對一 因此 ORM這裏雖然有個模型“ManyToManyField” 但是因爲並非原生而是原生基礎上有封裝 真正操作起來系統資源消耗大

對於book instance 我們就正常套路寫:

@admin.register(BookInstance)
class BookInstanceAdmin(admin.ModelAdmin):
    list_display = ('book', 'status','borrower', 'due_back','id')

在這裏插入圖片描述
這裏 你可能左邊的部分有了 右邊沒有
過濾器filter就是通過一些屬性過濾你不想要的記錄(具體就是那些書你不想要)‘’
比如查詢沒有被借走的書 可以用過status過濾 具體自己玩玩就知道

過濾器設置方式:

@admin.register(BookInstance)
class BookInstanceAdmin(admin.ModelAdmin):
    list_display = ('book', 'status','borrower', 'due_back','id')
    list_filter = ('status', 'due_back')

就是加了行 list_filter 而已

值得注意的是 列的順序 可以通過 元祖裏面 屬性的順序 進行改變:
比如我把status與book調換

@admin.register(BookInstance)
class BookInstanceAdmin(admin.ModelAdmin):
    list_display = ('status', 'book','borrower', 'due_back','id')
    list_filter = ('status', 'due_back')

結果:
在這裏插入圖片描述

對更新數據的頁面 我們可以這麼魔改

我們如果添加修改新的數據 比如 新的一本書:
在這裏插入圖片描述
然而我想做成下面這個樣式:
在這裏插入圖片描述
實現方式很簡單 你看了代碼就懂了:

@admin.register(BookInstance)
class BookInstanceAdmin(admin.ModelAdmin):
    list_display = ('status','book','borrower', 'due_back','id')
    list_filter = ('status', 'due_back')
    fieldsets = (
        ('base info', {
            'fields': ('book','imprint', 'id')
        }),
        ('Availability', {
            'fields': ('status', 'due_back','borrower')
        }),
    )

注意base info Availability 放在哪裏 你就可以自定義了 比方改成中文:)

另外 想要實現下面的效果:
在這裏插入圖片描述
看代碼就懂了:

@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
    list_display = ('last_name', 'first_name', 'date_of_birth', 'date_of_death')
    fields = ['first_name', 'last_name', ('date_of_birth', 'date_of_death')]

inline 內聯式的錄入數據

有時候 我們輸入書本種類信息的同時 也已經知道作者的信息 還有具體哪些書的信息
然而因爲書本book 與作者author 還有書的實例book instance 在不同的表上
這時mmmp 你得跑多兩趟
假設有好幾百個記錄 你真的是得哭

這裏我們可以這麼設計一波:
在添加作者author的時候 我們可以同時搞定他的書:
在這裏插入圖片描述
添加書的種類book的時候 我們可以添加書的實例:
在這裏插入圖片描述
怎麼設置的?下面是author設計的代碼:

class Authorinline(admin.TabularInline):
    model = Book

@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
    list_display = ('last_name', 'first_name', 'date_of_birth', 'date_of_death')
    fields = ['first_name', 'last_name', ('date_of_birth', 'date_of_death')]
    inlines = [Authorinline]

inline屬性重點關注 就是他搞得
而它引用了Authorinline類 其實就是引用Book類:)
(貌似很簡單的樣子)

同樣 book的admin也是這樣:

class BooksInstanceInline(admin.StackedInline):
    model = BookInstance

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'display_genre')
    inlines = [BooksInstanceInline]

那麼 我想修改作者的時候 加上書 書的實例 該怎麼辦:
我們可能會這麼寫:

class Author_book(admin.TabularInline):
    model = Book
class Author_bookInstance(admin.TabularInline):
    model = BookInstance

@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
    list_display = ('last_name', 'first_name', 'date_of_birth', 'date_of_death')
    fields = ['first_name', 'last_name', ('date_of_birth', 'date_of_death')]
    inlines = [Author_book,Author_bookInstance]

然後報錯

原因?
注意 inline 內聯別人 你需要外鍵
author與書的實例之間沒有聯繫 所以數據庫錄入沒法做

因此 你可以添加外鍵以後 實現這一壯舉:)

__str__

聰明的你應該發現了 我們list_display 還有filter放的都是 model.py 類的屬性名 無論是值屬性genre還是函數display_genre(也算是類的屬性)
其實我們就是用admin這個應用 引用類 引用類的屬性 這點適用於幾乎所有其他的app 這點請注意:)

那麼 直接引用屬性 爲啥就能真麼機智的把名字返回給你呢?這中間是不是有個函數在背後默默奉獻?
這就是model 類下面的__str__ 函數乾的事
於是 我們要是想來點自定義customization 就可以修改__str__
在這裏插入圖片描述
這裏 我把model.py author類的__str__ 改成:

    def __str__(self):
        return f'{self.last_name}+{self.first_name}'

這個更改以後 所有引用到author的 都會這麼顯示:
在這裏插入圖片描述
另外一種更改方式也很簡單 比方我需要在book的管理頁面顯示author 不用+號
但是其他的引用 用+號
這時 就把list_display 裏面的屬性 改成函數 就像我們整genre的方法一樣

具體同志們可以試試 很簡單的

總結 ´◡`

這一節我們學習了Django內置的admin的用法
另外舉一反三的瞭解了 app 管理數據庫(應該說ORM數據模型) 就是通過 註冊 引用類 引用屬性
這三板斧來實施的

下一站:服務端編程(九)- Django - 創建網站的基本骨架 創建你的主頁

  • 想學習數據庫 打好後端基礎嘛? 不妨從MySQL入手
    MySQL專欄

  • python這麼火 想要深入學習python 玩一下簡單的應用嘛?可以看我專欄 還在持續更新中哦:
    python應用

  • 小孩子才做選擇 大人全都要!對後端感興趣嗎?收下它吧:)
    手把手帶你學後端(服務端)

  • 謝謝支持! 阮菜雞有禮了:)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章