Django 4.2 复习笔记(八)Django 模板语言语法

作者:J.sky · 发表于:
2023-06-04T08:48:35.000000Z
· 更新于:
2023-08-13T22:54:57.612618Z
· Tag: Django

Django的页面渲染是通过Django的模板语法在模板中渲染上下文的变量来进行输出的,Django 的模板语言是为了在强大和简单之间取得平衡而设计的。它的设计让习惯于使用 HTML 的人感觉很舒服。如果你接触过其他基于文本的模板语言,如 Smarty 或 Jinja2 ,你应该会对 Django 的模板感到很舒服。

模板文件格式

模板是一个文本文件。它可以生成任何基于文本的格式(HTML、XML、CSV 等),模板中包含变量和标签。

一个简单的案例:

{% extends "base_generic.html" %}

{% block title %}{{ section.title }}{% endblock %}

{% block content %}
<h1>{{ section.title }}</h1>

{% for story in story_list %}
<h2>
<a href="{{ story.get_absolute_url }}">
    {{ story.headline|upper }}
</a>
</h2>
<p>{{ story.tease|truncatewords:"100" }}</p>
{% endfor %}
{% endblock %}

变量

模板语法:

view:{"HTML变量名" : "views变量名"}
HTML:{{变量名}}

其中变量可以为Python中的各种变量类型,例如:单一的变量,或是集合类的变量如list、dict等。

标签

标签是这样的: {% tag %}。标签比变量更复杂。有的在输出中创建文本,有的通过执行循环或逻辑来控制流程,有的将外部信息加载到模板中,供以后的变量使用。

if else

{% if condition1 %}
... display 1
{% elif condition2 %}
... display 2
{% else %}
... display 3
{% endif %}

遍历 for

<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% endfor %}
</ul>

过滤器

通过使用过滤器修改显示的变量。过滤器是这样的: {{ name|lower }}。这将显示 lower 过滤器过滤后的 {{ name }} 变量的值,该过滤器将文本转换为小写。使用管道(|)来应用过滤器。

例如:

{{ value|length }}

上边会输出数组的长度。

当然过滤器有很多的,具体可以查看官方的列表:内置过滤器参考

模板继承

Django 的模板引擎中最强大的——也是最复杂的——部分是模板继承。模板继承允许你建立一个基本的“骨架”模板,它包含了你网站的所有常用元素,并定义了子模板可以覆盖的块。

base.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="style.css">
    <title>{% block title %}My amazing site{% endblock %}</title>
</head>

<body>
    <div id="sidebar">
        {% block sidebar %}
        <ul>
            <li><a href="/">Home</a></li>
            <li><a href="/blog/">Blog</a></li>
        </ul>
        {% endblock %}
    </div>

    <div id="content">
        {% block content %}{% endblock %}
    </div>
</body>
</html>

这个模板,我们称之为 base.html,它定义了一个 HTML 骨架文档,你可以用它来制作一个两栏式页面。“子”模板的工作是用内容填充空块。

在这个例子中,block 标签定义了三个块,子模板可以填入其中。block 标签所做的就是告诉模板引擎,子模板可以覆盖模板的这些部分。

子模板继承:

{% extends "base.html" %}

{% block title %}My amazing blog{% endblock %}

{% block content %}
{% for entry in blog_entries %}
    <h2>{{ entry.title }}</h2>
    <p>{{ entry.body }}</p>
{% endfor %}
{% endblock %}

{% extends "base.html" %}表示继承模板bas.html{% block title %}My amazing blog{% endblock %}就是在改写模板中可以自定义的内容,通过这种继承的方式,可以构建复杂的网页。

总结

Django的模板语法还有很多功能可以使用,熟练这些功能可以大大的提高页面渲染开发的素的。

参考文章:

Django 模板语言

菜鸟教程 Django 模板