django框架admin使用
使用Admin站點
假設我們要設計一個新聞網站,我們需要編寫展示給使用者的頁面,網頁上展示的新聞資訊是從哪裡來的呢?是從資料庫中查詢到新聞的資訊,然後把它展示在頁面上。但是我們的網站上的新聞每天都要更新,這就意味著對資料庫的增、刪、改、查操作,那麼我們需要每天寫sql語句操作資料庫嗎? 如果這樣的話,是不是非常繁瑣,所以我們可以設計一個頁面,通過對這個頁面的操作來實現對新聞資料庫的增刪改查操作。那麼問題來了,老闆說我們需要在建立一個新網站,是不是還要設計一個頁面來實現對新網站資料庫的增刪改查操作,但是這樣的頁面具有一個很大的重複性,那有沒有一種方法能夠讓我們很快的生成管理資料庫表的頁面呢?有,那就是我們接下來要給大家講的Django的後臺管理。Django能夠根據定義的模型類自動地生成管理頁面。
使用Django的管理模組,需要按照如下步驟操作:
- 管理介面本地化
- 建立管理員
- 註冊模型類
- 自定義管理頁面
1 管理介面本地化
在settings.py中設定語言和時區
LANGUAGE_CODE = 'zh-hans' # 使用中國語言
TIME_ZONE = 'Asia/Shanghai' # 使用中國上海時間
2 建立超級管理員
建立管理員的命令如下,按提示輸入使用者名稱、郵箱、密碼。
python manage.py createsuperuser
開啟瀏覽器,在位址列中輸入如下地址後回車。
http://127.0.0.1:8000/admin/
輸入前面建立的使用者名稱、密碼完成登入。
登入成功後介面如下,但是並沒有我們自己應用模型的入口,接下來進行第三步操作。
3 註冊模型類
登入後臺管理後,預設沒有我們建立的應用中定義的模型類,需要在自己應用中的admin.py檔案中註冊,才可以在後臺管理中看到,並進行增刪改查操作。
開啟booktest/admin.py檔案,編寫如下程式碼:
from django.contrib import admin
from booktest.models import BookInfo,HeroInfo
admin.site.register(BookInfo)
admin.site.register(HeroInfo)
到瀏覽器中重新整理頁面,可以看到模型類BookInfo和HeroInfo的管理了。
點選類名稱"BookInfo"(圖書)可以進入列表頁,預設只有一列。
在列表頁中點選"增加"可以進入增加頁,Django會根據模型類的不同,生成不同的表單控制元件,按提示填寫表單內容後點擊"儲存",完成資料建立,建立成功後返回列表頁。
在列表頁中點選某行的第一列可以進入修改頁。
按照提示進行內容的修改,修改成功後進入列表頁。在修改頁點選“刪除”可以刪除一項。
刪除:在列表頁勾選想要刪除的複選框,可以刪除多項。
點選執行後進入確認頁面,刪除後回來列表頁面。
4 定義與使用Admin管理類
Django提供的Admin站點的展示效果可以通過自定義ModelAdmin類來進行控制。
定義管理類需要繼承自admin.ModelAdmin類,如下
from django.contrib import admin
class BookInfoAdmin(admin.ModelAdmin): pass
使用管理類有兩種方式:
-
註冊引數
admin.site.register(BookInfo,BookInfoAdmin)
-
裝飾器
@admin.register(BookInfo) class BookInfoAdmin(admin.ModelAdmin): pass
調整列表頁展示
1 頁大小
每頁中顯示多少條資料,預設為每頁顯示100條資料,屬性如下:
list_per_page=100
1)開啟booktest/admin.py檔案,修改AreaAdmin類如下:
class BookInfoAdmin(admin.ModelAdmin):
list_per_page = 2
2)在瀏覽器中檢視區域資訊的列表頁面,效果如下圖:
2 "操作選項"的位置
頂部顯示的屬性,設定為True在頂部顯示,設定為False不在頂部顯示,預設為True。
actions_on_top=True
底部顯示的屬性,設定為True在底部顯示,設定為False不在底部顯示,預設為False。
actions_on_bottom=False
1)開啟booktest/admin.py檔案,修改BookInfoAdmin類如下:
class BookInfoAdmin(admin.ModelAdmin):
...
actions_on_top = True actions_on_bottom = True
2)在瀏覽器中重新整理效果如下圖:
3 列表中的列
屬性如下:
list_display=[模型欄位1,模型欄位2,...]
1)開啟booktest/admin.py檔案,修改BookInfoAdmin類如下:
class BookInfoAdmin(admin.ModelAdmin):
...
list_display = ['id','btitle']
2)在瀏覽器中重新整理效果如下圖:
點選列頭可以進行升序或降序排列。
4 將方法作為列
列可以是模型欄位,還可以是模型方法,要求方法有返回值。
通過設定short_description屬性,可以設定在admin站點中顯示的列名。
1)開啟booktest/models.py檔案,修改BookInfo類如下:
class BookInfo(models.Model):
...
def pub_date(self): return self.bpub_date.strftime('%Y年%m月%d日') pub_date.short_description = '釋出日期' # 設定方法欄位在admin中顯示的標題
2)開啟booktest/admin.py檔案,修改BookInfoAdmin類如下:
class BookInfoAdmin(admin.ModelAdmin):
...
list_display = ['id','atitle','pub_date']
3)在瀏覽器中重新整理效果如下圖:
方法列是不能排序的,如果需要排序需要為方法指定排序依據。
admin_order_field=模型類欄位
1)開啟booktest/models.py檔案,修改BookInfo類如下:
class BookInfo(models.Model):
...
def pub_date(self): return self.bpub_date.strftime('%Y年%m月%d日') pub_date.short_description = '釋出日期' pub_date.admin_order_field = 'bpub_date'
2)在瀏覽器中重新整理效果如下圖:
5 關聯物件
無法直接訪問關聯物件的屬性或方法,可以在模型類中封裝方法,訪問關聯物件的成員。
1)開啟booktest/models.py檔案,修改HeroInfo類如下:
class HeroInfo(models.Model):
...
def read(self): return self.hbook.bread read.short_description = '圖書閱讀量'
2)開啟booktest/admin.py檔案,修改HeroInfoAdmin類如下:
class HeroInfoAdmin(admin.ModelAdmin):
...
list_display = ['id', 'hname', 'hbook', 'read']
3)在瀏覽器中重新整理效果如下圖:
6 右側欄過濾器
屬性如下,只能接收欄位,會將對應欄位的值列出來,用於快速過濾。一般用於有重複值的欄位。
list_filter=[]
1)開啟booktest/admin.py檔案,修改HeroInfoAdmin類如下:
class HeroInfoAdmin(admin.ModelAdmin):
...
list_filter = ['hbook', 'hgender']
2)在瀏覽器中重新整理效果如下圖:
7 搜尋框
屬性如下,用於對指定欄位的值進行搜尋,支援模糊查詢。列表型別,表示在這些欄位上進行搜尋。
search_fields=[]
1)開啟booktest/admin.py檔案,修改HeroInfoAdmin類如下:
class HeroInfoAdmin(admin.ModelAdmin):
...
search_fields = ['hname']
2)在瀏覽器中重新整理效果如下圖: