Django admin 模板分析及使用

环境信息

  • Python 3.11
  • Django 4.1

admin 模板解析

Django 模板之间存在各种复杂的继承关系,最基础的模板为 base.html,文件位于 python3.11/site-packages/django/contrib/admin/templates/admin/base.html。下面以 Admin 页面中的各个模块来解析实现对应模块的模板及代码。

title

title 指网页标题,以 Admin 站点的首页为例,首页的模板文件 index.html 中未定义 title 信息,而是继承自 base_site.html

base_site.html
{% extends "admin/base.html" %}

{% block title %}{% if subtitle %}{{ subtitle }} | {% endif %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock
%}

base_site.html 模板继承了模板 base.html,并使用 {% block title %} 标签复写了继承自 base.html 模板的 title 信息。默认显示 Django site admin,如果应用的 admin.py 中定义了 admin.site.site_title,则显示其内容

base.html
{% load i18n static %}<!DOCTYPE html>
{% get_current_language as LANGUAGE_CODE %}{% get_current_language_bidi as LANGUAGE_BIDI %}
<html lang="{{ LANGUAGE_CODE|default:"en-us" }}" dir="{{ LANGUAGE_BIDI|yesno:'rtl,ltr,auto' }}">
<head>
<title>{% block title %}{% endblock %}</title>

基础模板 base.htmltitle 信息默认为空。

Django 管理或站点标题

Admin 管理页面最顶部左上角会展示默认的 Django 管理 或者站点标题,如果应用的 admin.py 中配置了 admin.site.site_header,则显示站点标题,这是一个链接,点击后会跳转首页。

这部分的实现是通过继承 base_site.html 实现,其中的 {% block branding %} 定义了这部分内容。

base_site.html
{% extends "admin/base.html" %}

{% block title %}{% if subtitle %}{{ subtitle }} | {% endif %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %}

{% block branding %}
<h1 id="site-name"><a href="{% url 'admin:index' %}">{{ site_header|default:_('Django administration') }}</a></h1>
{% endblock %}

{% block nav-global %}{% endblock %}

用户欢迎信息

Django admin 站点默认会显示如下的欢饮信息及修改密码、注销等链接

此处的配置位于 base.html 中的 {% block usertools %} 块内,{% block usertools %} 块位于 {% block header %} 块内。

base.html
{% block header %}
<div id="header">
<div id="branding">
{% block branding %}{% endblock %}
</div>
{% block usertools %}
{% if has_permission %}
<div id="user-tools">
{% block welcome-msg %}
{% translate 'Welcome,' %}
<strong>{% firstof user.get_short_name user.get_username %}</strong>.
{% endblock %}
{% block userlinks %}
{% if site_url %}
<a href="{{ site_url }}">{% translate 'View site' %}</a> /
{% endif %}
{% if user.is_active and user.is_staff %}
{% url 'django-admindocs-docroot' as docsroot %}
{% if docsroot %}
<a href="{{ docsroot }}">{% translate 'Documentation' %}</a> /
{% endif %}
{% endif %}
{% if user.has_usable_password %}
<a href="{% url 'admin:password_change' %}">{% translate 'Change password' %}</a> /
{% endif %}
<a href="{% url 'admin:logout' %}">{% translate 'Log out' %}</a>
{% endblock %}
</div>
{% endif %}
{% endblock %}
{% block nav-global %}{% endblock %}
</div>
{% endblock %}

自定义页面

自定义和 Django admin 风格一样的页面

如果要自定义自己的页面,并实现和 Django admin 一致的风格,比如一样的 branding 和用户欢迎信息,可以使用如下代码实现

{% extends "admin/base_site.html" %}
{% load i18n static %}

{% block title %}
My Customize Site
{% endblock %}

{% block extrastyle %}

{% endblock %}

{% block branding %}
<h1 id="site-name"><a href="{% url 'admin:index' %}">My Customize Site</a></h1>
{% endblock %}

{% block usertools %}
<div id="user-tools">
{% block welcome-msg %}
{% translate 'Welcome,' %}
<strong>{% firstof user.get_short_name user.get_username %}</strong>.
{% endblock %}
{% block userlinks %}
{% if site_url %}
<a href="{{ site_url }}">{% translate 'View site' %}</a> /
{% endif %}
{% if user.is_active and user.is_staff %}
{% url 'django-admindocs-docroot' as docsroot %}
{% if docsroot %}
<a href="{{ docsroot }}">{% translate 'Documentation' %}</a> /
{% endif %}
{% endif %}
{% if user.has_usable_password %}
<a href="{% url 'admin:password_change' %}">{% translate 'Change password' %}</a> /
{% endif %}
<a href="{% url 'admin:logout' %}">{% translate 'Log out' %}</a>
{% endblock %}
</div>

{% endblock %}

{% block breadcrumbs %}{% endblock %}
{% block content %}
hello world
{% endblock %}