admin
admin
是Django
自帶的後臺管理元件,你可以在admin
中執行增刪改查等操作。
它以視覺化的方式讓你來操縱模型表,十分的便捷。
基本使用
資料準備
如下,在app01
中有一個這樣的模型表:
from django.db import models
# Create your models here.
class User(models.Model):
user_id = models.AutoField(primary_key=True, verbose_name="使用者編號")
user_name = models.CharField(max_length=32, verbose_name="使用者名稱")
user_gender = models.BooleanField(
choices=([0, "male"], [1, "female"]), verbose_name="使用者性別")
user_introduction = models.TextField(
max_length=1024, null=True, blank=True, verbose_name="使用者簡介")
def __str__(self):
return self.user_name
建立使用者
當執行了資料庫遷徙命令後,需要建立一個可登入admin
進行管理的超級賬戶。
python manage.py createsuperuser
它會提示你輸入使用者名稱,以及密碼,密碼不能少於八位。
可以選填郵箱。
註冊admin
管理員使用者建立完成後,在app01
應用下進行註冊。
from django.contrib import admin
from .models import *
admin.site.register(User)
接下來開啟admin
,輸入賬戶名與密碼後,就可以看到這張表。
接下來就可以對該表進行增刪改查了。
深度配置
models引數
在建立模型表時,可以對欄位新增一些與admin
相關的引數。
引數 | 描述 |
---|---|
verbose_name | Admin中顯示的欄位名稱 |
blank | Admin中進行新增或編輯時,該欄位是否可以為空 |
editable | Admin中是否可編輯該欄位 |
help_text | Admin中的幫助資訊 |
choices | Admin中選擇框顯示的內容 |
在這裡的blank
與verbose_name
以及choices
都比較常用。
除了在模型表的欄位上進行配置外,也可以在該表下定製元資訊。這其中有關於該表在Admin
中的資訊顯示,如下所示:
class User(models.Model):
欄位 = 型別(條件)
欄位 = 型別(條件)
class Meta:
verbose_name = "Admin中顯示的表名"
admin配置
如果要對一個註冊的表進行深度配置,可在admin.py
中對它進行。
常用的配置方式有兩種,如下所示:
from django.contrib import admin
# 裝飾器註冊
@admin.register(User)
class UserConfig(admin.ModelAdmin):
配置項....
# 使用site
class UserConfig(admin.ModelAdmin):
配置項....
admin.site.register(CustomAdmin, UserConfig) # 應用配置項
下面是admin
深度配置的一些常用選項。
from django.contrib import admin
from .models import *
# Register your models here.
class UserConfig(admin.ModelAdmin):
# 自定義欄位,作用顯示
def edit(self):
return "編輯"
# 以下是自定義admin的使用
# 新增資料模板頁
# add_form_template = None
# 修改資料的模板頁
# change_form_template = None
# 修改多條資料的模板頁
# change_list_template = None
# 刪除確認資訊模板頁
# delete_confirmation_template = None
# 刪除關聯資料的確認頁
# delete_selected_confirmation_template = None
# 修改歷史的模板頁
# object_history_template = None
# 彈出框模板頁
# popup_response_template = None
# 不支援多對多欄位,展示表中的欄位。
list_display = ["user_id", "user_name","user_gender",edit]
# 點選欄位可進入change頁面
list_display_links = [edit]
# 過濾篩選,支援各種關係
list_filter = ["user_gender"]
# 支援在頁面修改的欄位,與list_display_links有衝突
list_editable = ["user_name"]
# 模糊搜尋,可以按照編號、名字搜尋.或關係
search_fields = ["user_id","user_name"]
# 用於和action定製項做批處理
def patch_init(self,request,queryset):
"""
queryset:選中的字典
"""
# 選中的使用者全改為男性...
queryset.update(user_gender=False)
# 新增描述
patch_init.short_description = "批量修改性別"
actions = [patch_init]
admin.site.register(User)
以下是配置完成後的樣式,自行對應配置項進行配置後檢視即可。
中文顯示
如果想要在admin
中進行中文顯示,則可以在全域性的settings.py
中配置語言。
# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-Hans' # 中文顯示
執行流程
在啟動django
專案時,第一步會去settings
中匯入各種模組。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01.apps.App01Config',
]
檢視admin
原始碼from django.contrib import admin
,它下面有這樣的一個函式,該函式的作用就是將所有app
下的admin
都會做一次匯入。
def autodiscover():
autodiscover_modules('admin', register_to=site)
我們知道,在模組匯入時,會執行該模組中的程式碼,那麼在admin.site
進行註冊時,實際上是應用單例模式進行註冊。
使用admin.site.register()
實際上都是在使用單例物件下的方法,並不會重複生成多個物件。
class AdminSite(object):
def __init__(self):
self._registry = {}
def register(self, model, admin_class = None):
# 設定配置類
if not admin_class:
admin_class = ModelAdmin
self._registry[model] = admin_class(model, self)
site = AdminSite() # 最後一行
admin
中單例物件的應用也非常簡單,它是以模組的方式應用單例物件,因為我們知道模組只會執行一次。
如下所示:
# f1.py 模組
class Test(object):
def __init__(self,name):
self.name = name
t1 = Test("測試")
當其他檔案進行多次匯入時,只會匯入一次,此時使用的t1
永遠都是單例物件,不會重複例項化:
import f1
f1.t1()