Django admin神奇的AdminSite 對象妙用

Django在Python web開發領域的地位可謂是無可替代,它大而全,任何你能想到的基本功能框架已經內置,能夠很方便的達到開箱即用的效果,以Django自帶的admin管理後臺爲例,藉助admin可視化的管理面板,咱們只須要經過少許的代碼就能夠擁有一個特別完整的站點,快速實現需求。html

但在開發中,不免admin的佈局不符合要求,咱們想改,想添加數據無從下手,直接覆蓋默認的admin彷佛並非最明智的選擇,安裝了不少第三方後臺管理程序,用起來彷佛尚未django admin好用,那咱們今天就來看看如何經過AdminSite對象來自定義咱們的管理站點!python

管理後臺看到的第一個頁面是登陸頁面,那麼咱們就先來自定義咱們的登陸頁!這裏就忽略掉了建立項目及app的方法,相信這些基礎的知識你已經掌握了!git

這裏咱們建立了一個項目DjangoMall和一個dadminapp,這個dadminapp將代替django默認的admin,全部咱們自定義admin的信息都放在這裏, 項目解構以下!web

項目解構

自定義AdminSite類

自定義本身的管理站點,只須要將 AdminSite 子類化,並覆蓋或添加任何你喜歡的內容。而後,建立一個你的 AdminSite 子類的實例(與你實例化任何其餘 Python 類的方式相同),並用它註冊你的模型和 ModelAdmin 子類,而不是用默認站點。最後,更新 DjangoMall/urls.py 來引用你的 AdminSite 子類。django

  1. dadmin/admin.py中構造本身的AdminSite 子類的實例:
# dadmin/admin.py

from django.contrib import admin

class DadminSite(admin.AdminSite):
    site_title = '管理站點<title>末尾的文字'
    site_header = '放在每一個管理頁面頂部的文字,默認爲Django管理'
    index_title = '索引頁頂部的文字,默認爲「網站管理」'

admin_site = DadminSite(name='byadmin')
複製代碼
  1. DjangoMall/urls.py中引入你的DadminSite
# DjangoMall/urls.py

from django.urls import path
from dadmin.admin import admin_site

urlpatterns = [
    path('admin/', admin.site.urls),    # 默認後臺管理的url
    path('byadmin/', admin_site.urls),  # 咱們本身的管理站點url
]
複製代碼

當咱們在瀏覽器訪問127.0.0.1:8000/byadmin/後會發現咱們擁有了一個和默認admin同樣的管理站點,下來只須要自定義咱們管理站點的模板便可!api

下邊是我已經設置好的一段代碼,先上代碼,再來解讀代碼!瀏覽器

# dadmin/admin.py

from django.contrib import admin
from django.utils.translation import gettext as _, gettext_lazy
from django.views.decorators.cache import never_cache

# Register your models here.
from .forms import DadminAuthenticationForm

class DadminSite(admin.AdminSite):
    # Text to put at the end of each page's <title>.
    site_title = gettext_lazy('DjangoMall site admin')

    # Text to put in each page's <h1>.
    site_header = gettext_lazy('DjanaoMall 管理')

    # Text to put at the top of the admin index page.
    index_title = gettext_lazy('Site administration')
    
    login_form = DadminAuthenticationForm
    login_template = "dadmin/login.html"
    index_template = 'dadmin/index.html'

    def get_urls(self):
        urls = super().get_urls()
        from dadmin.urls import admin_urls
        admin_urls = admin_urls
        return admin_urls + urls

 @never_cache
    def index(self, request, extra_context=None):
        """ 繼承admin index向index添加數據 """
        extra_context = {'ceshi': 'ceshi'}
        index_template = super().index(request, extra_context=extra_context)
        return index_template

admin_site = DadminSite(name='byadmin')
複製代碼

AdminSite屬性

以上代碼中的login_formlogin_templateindex_template爲它的屬性,用來覆蓋或擴展基本的管理模板!除了以上幾個還有不少,具體你們能夠看看源碼就明白了或查看官方文檔!微信

這是官方文檔:docs.djangoproject.com/zh-hans/3.2…markdown

代碼中的get_urls方法咱們繼承了AdminSite的get_urls方法向管理站點添加了一個新的視圖! index方法繼承了AdminSite的index方法,在extra_context中放入了咱們想添加的數據,並返回給頁面,這樣咱們就能夠在首頁添加任何咱們想顯示的數據,例如數據圖標統計功能等!app

微信截圖_20210809130406.png

這就是咱們自定義的管理站點首頁界面!

詳細代碼請你們參考倉庫:gitee.com/xingfugz/dj…

相關文章
相關標籤/搜索