使用 extends include 和 blocks

摘要

  • {%extends%} :这会将作为参数给出的模板声明为当前模板的父级。用法:{% extends 'parent_template.html' %}

  • {%block%} {%endblock%} :这用于定义模板中的部分,因此如果另一个模板扩展了这个部分,它将能够替换其中编写的任何 html 代码。块由其名称标识。用法:{% block content %} <html_code> {% endblock %}

  • {%include%} :这将在当前模板中插入模板。请注意,包含的模板将接收请求的上下文,你也可以为其提供自定义变量。基本用法:{% include 'template_name.html' %},变量用法:{% include 'template_name.html' with variable='value' variable2=8 %}

指南

假设你正在构建前端代码,并为所有代码提供通用布局,并且你不希望为每个模板重复代码。Django 为你提供了内置标签。
假设我们有一个博客网站有 3 个共享相同布局的模板:

project_directory
    ..
    templates
      front-page.html
      blogs.html
      blog-detail.html

1)定义 base.html 文件,

<html>
  <head>
  </head>

  <body>
        {% block content %}
        {% endblock %}
   </body>
</html>

2)在 blog.html 中扩展它,就像,

{% extends 'base.html' %}

{% block content %}
    # write your blog related code here
{% endblock %}

# None of the code written here will be added to the template

这里我们扩展了基本布局,因此它的 HTML 布局现在可以在 blog.html 文件中使用 .{ % block %} 的概念是模板继承,它允许你构建一个基础骨架模板,其中包含你站点的所有常见元素并定义该子块模板可以覆盖。

3)现在假设你的所有 3 个模板也有相同的 HTML div,它定义了一些流行的帖子。而不是被写入 3 次创建一个新的模板 posts.html

blog.html

{% extends 'base.html' %}

{% block content %}
    # write your blog related code here
    {% include 'posts.html' %} # includes posts.html in blog.html file without passing any data
    <!-- or -->
    {% include 'posts.html' with posts=postdata %} # includes posts.html in blog.html file with passing posts data which is context of view function returns.
{% endblock %}