使用Django的admin管理工具,可以快速的构建自己的管理平台,使用Django原生太的模板更能使我们节省很多工作量。但有时候,模板上展现的内容并不能满足我们的业务需求,我们需要些许调整就可以达到我们想要的效果,此时我们可以通过重写admin模板来实现。
我们继续使用前面两篇文档中所使用的项目,并在此基础上来作调整。我们假设我们只允许添加Vm、查看Vm,不允许编辑Vm信息。因为添加、查看、编辑使用的是同一个模板文件,就必须重写模板文件。
重写模板
关键步骤
首先在我们的项目根目录下建立一个子templates目录 。
其次在templates目录下建立一个admin子目录。
然后在admin目录下以我人的应用名建立一个子目录(需要小写),如我们的应用cloud 。
在应用目录下以模型层的名字建立一个子目录(需要小写),如在cloud目录下创建vm目录。
我们从django/contrib/admin/templates/admin目录下拷贝change_form.html文件到我们新建立的vm目录下。
-
项目目录结构
-
修改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 %}代码块,如图示:
-
去除{% block submit_buttons_bottom %}{% submit_row %}{% endblock %}代码,如图所示:
在{% block after_related_objects %}{% endblock %}代码后面新增代码{% if add %}{% block submit_buttons_bottom %}{% submit_row %}{% endblock %}{% endif %},如图示:
-
启动项目,查看运行结果,新增信息时,有提交按钮,编辑页没有提交按钮。如图所示:
修改站点名称与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 页面特别有用。