使用Django的admin管理工具,可以快速的構建自己的管理平臺,使用Django原生太的模板更能使我們節省很多工作量。但有時候,模板上展現的內容并不能滿足我們的業務需求,我們需要些許調整就可以達到我們想要的效果,此時我們可以通過重寫admin模板來實現。
我們繼續使用前面兩篇文檔中所使用的項目,并在此基礎上來作調整。我們假設我們只允許添加Vm、查看Vm,不允許編輯Vm信息。因為添加、查看、編輯使用的是同一個模板文件,就必須重寫模板文件。
重寫模板
關鍵步驟
首先在我們的項目根目錄下建立一個子templates目錄 。
其次在templates目錄下建立一個admin子目錄。
然后在admin目錄下以我人的應用名建立一個子目錄(需要小寫),如我們的應用cloud 。
在應用目錄下以模型層的名字建立一個子目錄(需要小寫),如在cloud目錄下創建vm目錄。
我們從django/contrib/admin/templates/admin目錄下拷貝change_form.html文件到我們新建立的vm目錄下。
-
項目目錄結構
重寫模板.png -
修改setting.py文件中的配置項TEMPLATES, 將DIRS的值設置為[os.path.join(BASE_DIR, 'templates')]。TEMPLATES的整體信息如下:
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]
修改chang_form.html文件
修改chang_form.html文件
-
去除{% block object-tools %}……{% endblock %}代碼塊,如圖示:
重寫模板_去除代碼.png -
去除{% block submit_buttons_bottom %}{% submit_row %}{% endblock %}代碼,如圖所示:
重寫模板_去除代碼_操作按鈕.png 在{% block after_related_objects %}{% endblock %}代碼后面新增代碼{% if add %}{% block submit_buttons_bottom %}{% submit_row %}{% endblock %}{% endif %},如圖示:
-
啟動項目,查看運行結果,新增信息時,有提交按鈕,編輯頁沒有提交按鈕。如圖所示: 新增.png修改.png
修改站點名稱與Title
從 django/contrib/admin/templates/admin 目錄下拷貝base_site.html文件至項目/templates/admin目錄下。修改base_site.html,使之內容如下:
{% extends "admin/base.html" %}
{% block title %}云主機管理{% endblock %}
{% block branding %}
<h1 id="site-name"><a href="{% url 'admin:index' %}">云主機管理</a></h1>
{% endblock %}
{% block nav-global %}{% endblock %}
查看修改后效果:補充
如果想整個站點以中文的形式展現,我們需要做一些全局配置。在settings.py文件中,找到LANGUAGE_CODE與TIME_ZONE,分別設置為‘zh-hans’與‘Asia/Shanghai’,修改之后,代碼如下:
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
啟動服務,查看效果,我們會發現界面以中文展現:
知識鏈接
Admin模板文件位于contrib/admin/templates/admin 目錄中。
如要覆蓋一個或多個模板,首先在你的項目的templates 目錄中創建一個admin 目錄。它可以是你在TEMPLATES 設置的DjangoTemplates 后端的DIRS 選項中指定的任何目錄。如果你已經自定義'loaders' 選項,請確保'django.template.loaders.filesystem.Loader' 出現在 'django.template.loaders.app_directories 之前。Loader',以便在包含django.contrib.admin的模板之前,模板加載系統可以找到您的自定義模板。
為一個特定的app重寫admin模板, 需要拷貝django/contrib/admin/templates/admin 目錄到你創建的app目錄下, 并且修改它們.
如果我們只想為名為“Page”的特定模型添加一個工具到更改列表視圖,我們將把同一個文件復制到我們項目的templates/admin/my_app/page目錄。
每個應用或模型中可以被重寫的模板
不是contrib/admin/templates/admin 中的每個模板都可以在每個應用或每個模型中覆蓋。以下可以 ︰
app_index.html
change_form.html
change_list.html
delete_confirmation.html
object_history.html
對于那些不能以這種方式重寫的模板,你可能仍然為您的整個項目重寫它們。只需要將新版本放在你的templates/admin 目錄下。這對于要創建自定義的404 和500 頁面特別有用。