文章目錄
前言 ´・ᴗ・`
- 本節主要講了 如何配置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應用 -
小孩子才做選擇 大人全都要!對後端感興趣嗎?收下它吧:)
手把手帶你學後端(服務端) -
謝謝支持! 阮菜雞有禮了:)