上一節我們生成了一個會員的模型, 這一節主要講如何控制會員模塊在後臺的操作, 包括控制後臺中會員模塊列表的展示以及新增/編輯頁面的表單和新增編輯時的驗證
項目地址:https://gitee.com/ccnv07/django_example
運行開發服務器
> cd cms
> python manager.py runserver
打開瀏覽器http://127.0.0.1:8000/admin
就可以看到後臺的登錄窗口
創建超級管理員
因爲我們還沒有後臺的超級管理員, 先用命令行創建一個
> cd cms
> python manager.py createsuperuser
按照提示輸入Username, Password即可, 在瀏覽器中輸入賬號密碼就可以登錄到後臺了
將Account模塊註冊到後臺中
登錄成功後發現沒有我們的Account模塊, 現在我們就來把Account模塊註冊到後臺中
# account/admin.py
from django.contrib import admin
from .models import Account
admin.site.register(Account)
然後再刷新瀏覽器, 就會發現出現了Account模塊, 但是顯示的界面全都是英文的
另外還有一種裝飾器的註冊方式
# account/admin.py
from django.contrib import admin
from .models import Account
@admin.register(Account)
class AccountAdmin(admin.ModelAdmin):
pass
也會實現同樣的效果
將django中文化
django當然替我們想到了這一點
# cms/settings.py
# 指定語言爲中文
LANGUAGE_CODE = 'zh-Hans'
# 指定時區
TIME_ZONE = 'PRC'
# 改爲False, 存入數據庫的時間才正常, 否則會比正常時間少八個小時
USE_TZ = False
用ModelAdmin來修改管理界面與操作
# account/admin.py
from django.contrib import admin
from .models import Account
@admin.register(Account)
class AccountAdmin(admin.ModelAdmin):
# 控制列表頁按鈕顯示位置
actions_on_top = False
actions_on_bottom = True
# 是否顯示列表頁數據數量([選中了n箇中的m個])
actions_selection_counter = True
ModelAdmin是後臺指定模塊的一個控制類, 包括後臺的列表頁面樣式、數據、以及編輯/新增, 操作方法等都由這個類控制, 當繼承這個類, 我們就可以通過覆蓋這個類的方法, 來完成我們的一些操作
ModelAdmin的配置參數
actions
指定自定義的操作列表
如果是定義的function, 則
actions = [函數名]
如果是class的function, 則
actions = ['類中的方法名']
actions_on_top
指定列表頁按鈕的是否在上邊, 設置爲True則在上面
actions_on_bottom
同actions_on_top, 只不過是是否在下方
date_hierarchy
只可作用在DateField和DateTimeField上, 設置後, 可以根據時間段, 去過濾數據
class AccountAdmin(models.ModelAdmin):
...忽略其他代碼
date_hierarchy = 'create_time'
exclude
排除新增/編輯頁面需要顯示的字段
fields
指定新增、編輯頁面要顯示的字段
fields = ('account', 'nickname', 'password', 'email', 'phone', 'status')
list_display
控制列表頁要顯示的字段
list_display = ('account', 'nickname', 'email', 'phone', 'status',
'create_time')
list_display_links
指定哪些在列表頁顯示的字段上加鏈接
list_display_links = ('account', )
list_editable
指定哪些字段可以直接在列表頁編輯
list_editable = ('status', )
list_filter
列表頁過濾條件
list_filter = ('status', )
ordering
排序, 影響order_by
ordering = ['id]
list_per_page
控制每頁顯示的數據數量
ModelAdmin增加自定義操作
每個會員的狀態有啓用和禁用兩種, 現在我們想要增加一個操作來批量啓用和禁用
先定義一個操作的方法
class AccountAdmin(models.ModelAdmin):
def disable_account(self, request, queryset):
queryset.update(status=0)
disable_account.short_description='啓用'
disable_account包含兩個參數request
是HttpRequest對象, 包含請求的所有清晰queryset
是數據庫操作的QuerySet對象, 也就是當我們點擊了操作按鈕後, 就會執行queryset.filter(id__in=選中的id).update(status=0), django已經提前幫我們寫好了queryset.filter()這部分寫好了。
disable_account.short_description是指定這個操作在後臺顯示的名稱
定義好方法後, 需要將操作的方法寫入到actions屬性中才會生效
class AccountAdmin(models.ModelAdmin):
actions = ['disable_ccount']
def disable_account(self, request, queryset):
queryset.update(status=0)
disable_account.short_description='啓用'
同樣的, 我們可以再定義一個enable_accoun方法。
然後在列表頁的動作中, 就可以看到我們定義的操作了
另一種增加自定義操作的方法
這種方法可以用在一般通用方法中, 比如我們的account模型有一個is_deleted字段, 這個字段的意思是在數據刪除後, 設置is_deleted爲1, 默認正常時是0, 而django默認的刪除操作是直接物理刪除數據, 所以我們需要重寫刪除的方法
# account/admin.py
from django.contrib import admin
# 禁用默認的刪除操作
admin.site.disable_action('delete_selected')
這樣就會禁用掉默認的刪除操作
# 重新定義一個刪除操作
def deleted_select(self, request, queryset):
queryset.update(is_deleted=1)
原理和之前我們增加操作方法一樣
將這個操作註冊到admin站點中
admin.site.add_action(deleted_select, '刪除數據')
add_action第一個參數是操作的函數名, 第二個是顯示的按鈕
修改ModelAdmin默認的數據查詢方法
在我們修改了刪除操作後, 發現即使我們刪除了數據, 列表中還是會出現, 這個是不符合我們預期的
所以我們要重寫ModelAdmin的查詢數據方法, 過濾掉is_deleted=1的數據
class AccountAdmin(admin.ModelAdmin):
...省略代碼
def get_queryset(self, request):
queryset = super().get_queryset(request)
return queryset.filter(is_deleted=0)
第一步queryset = super().get_queryset(request)
, 就是獲取到ModelAdmin的查詢對象QuerySet, 然後增加過濾條件filter, 然後ModelAdmin會繼續操作查詢的方法。
至此, 我們的會員管理列表的全部操作就講完了。下一節, 就需要重點講一下