模板结构优化

引入模板

有时候一些代码是在许多模板中都用到的。可以把重复代码抽取出来,以后想要使用这些代码时,就通过include包含进来。

# header.html
<p>header</p>

# footer.html
<p>footer</p>

# main.html
{% include 'header.html' %}
<p>main</p>
{% include 'footer.html' %}

include标签寻找路径的方式,与render渲染模板的函数相同。

默认include标签包含模板,会自动使用主模板的上下文(即自动使用主模板的变量)

# header.html
<p>user: {{ username }}</p>

# main.html
{% include "header.html" with username='Mike' %}

模板继承

类似python中的类,可以在父模板中定义好一些子模板需要用到的代码,子模板直接继承。

父模板代码base.html

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="{% static 'style.css' %}">
<title>{% block title %} 我的站点 {% endblock %}</title>
</head>
<body>
<div id="siderbar">
{% block siderbar %}
<ul>
<li><a href="/">首页</a></li>
<li><a href="/blog/">博客</a></li>
</ul>
{% endblock %}
</div>
<div id="content">
{% block content %}{% endblock %}
</div>
</body>
</html>

子模板代码

{% extends 'base.html' %}

{% block siderbar %}
{{ block.super }}
<li><a href='/about/'>关于</li>
{% endblock %}

{% block content %}
<p>子模板内容</p>
{% endblock %}

加载静态文件

在一个网页中,不仅只有一个html骨架,还需要css样式文件,js执行文件以及一些图片。在DTL中,使用static标签来加载静态文件。要使用static标签,首先需要{% load static %}

  1. django.contrib.staticfiles已添加到settings.INSTALLED_APPS

  2. settings.py中设置了STATIC_URL

  3. 在已安装的app下创建名为static的目录,在此目录下创建一个当前app名的目录,再将静态文件放在此目录下(避免相同文件名的静态文件在不同app下导致模板查找静态文件产生混淆)

  4. 如果有一些静态文件不和任何app挂钩,可以在settings.py中添加STATICFILES_DIRS,以后DTL就会在这个列表路径中查找静态文件。

    STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static")
    ]
  5. 在模板中使用load标签加载static标签。

    {% load static %}
    <link rel="stylesheet" href="{% static 'style.css' %}">
  6. 如果不想每次在模板中加载静态文件都使用load加载static标签,可以在settings.py中的TEMPLATES/OPTIONS添加'builtins':['django.templatetags.static'],这样以后在模板中就可以直接使用static标签,而不用手动load

  7. 如果没有在settings.INSTALLED_APPS中添加django.contrib.staticfiles。需要手动将请求的url与静态文件的路径进行映射

    from django.conf import settings
    from django.conf.urls.static import static

    urlpatterns = [
    # 其他的url映射
    ] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)