Django admin元件

雲崖先生發表於2020-10-23

admin

   adminDjango自帶的後臺管理元件,你可以在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,輸入賬戶名與密碼後,就可以看到這張表。

   image-20201023144617473

   接下來就可以對該表進行增刪改查了。

   image-20201023144728667

深度配置

models引數

   在建立模型表時,可以對欄位新增一些與admin相關的引數。

引數描述
verbose_name Admin中顯示的欄位名稱
blank Admin中進行新增或編輯時,該欄位是否可以為空
editable Admin中是否可編輯該欄位
help_text Admin中的幫助資訊
choices Admin中選擇框顯示的內容

   在這裡的blankverbose_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)

   以下是配置完成後的樣式,自行對應配置項進行配置後檢視即可。

   image-20201023150242020

中文顯示

   如果想要在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()

相關文章