Django admin組件


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()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM