Django 模板
创建模板
在 polls 应用目录下创建一个 templates 目录。Django 将会在这个目录里查找模板文件。
mysite/settings.py 的 TEMPLATES 配置项描述了 Django 如何载入和渲染模板。默认的设置文件设置了 DjangoTemplates 后端,并设置 APP_DIRS =True。这一选项将会让 DjangoTemplates 在每个 INSTALLED_APPS 文件夹中寻找 templates 子目录。
新建一个模板文件 polls/templates/polls/index.html,并添加如下代码:
{% if question_list %}
<ul>
{% for question in question_list %}
<li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No polls are available.</p>
{% endif %}
然后,我们在 polls/views.py 里创建一个 index() 视图函数来使用模板:
def index(request):
question_list = Question.objects.all()
return render(request, 'polls/index.html', {'question_list': question_list})
render() 函数把 request 对象作为它的第一个参数,模板作为第二个参数,字典作为可选的第三个参数。传递给模板一个 HttpResponse 对象。
最后将新视图添加进 polls.urls 模块:
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
模板语言
模板是由HTML代码和逻辑控制代码组成,用来分离一个文档(通常是HTML)的表现形式和内容。
1. 变量
变量的形式: {{ variable }}
使用 "." 访问变量的属性。
当 templates 引擎遇到变量时,引擎使用变量的值代替变量。当 templates 引擎遇到 "." 的时候,会按照如下顺序查询:
字典查询,比如 foo["bar"]
属性或方法查询,比如 foo.bar 或 foo.bar()
数字索引查询,比如 foo[bar]
如果变量不存在,模版系统将插入空字符串。在模板中调用方法时,不能传递参数给方法。
2. 标签
标签的形式: {% tag %}
(1)if 标签
{% if 判断条件 %}
执行语句
{% elif 判断条件 %} #可选
执行语句
{% else %} #可选
执行语句
{% endif %}
{% if %} 标签接受 and,or 或 not 关键字来对多个变量做判断。在同一个标签中可以同时使用 and 或同时使用 or,但不能混合使用。
(2)ifequal/ifnotequal 标签
{% ifequal %} 标签比较两个值,如果他们相等,显示在 {% ifequal %} 和 {% endifequal %} 之间的所有代码。
(3)for 标签
{% for ... in ... %}
执行语句
{% empty %} #可选
执行语句
{% endfor %}
在{% for %}标签中,可以访问 forloop 变量,该变量有几个常用的属性:
forloop.counter:表示当前循环执行次数的计数器,从1开始。
forloop.counter0:表示当前循环执行次数的计数器,从0开始。
forloop.revcounter:表示当前循环剩余的元素数量,最后一次循环时,值为1。
forloop.revcounter0:表示当前循环剩余的元素数量,最后一次循环时,值为0。
forloop.first:布尔值,是否为第一次循环。
forloop.last:布尔值,是否为最后一次循环。
forloop.parentloop:是一个指向当前循环的上一级循环的 forloop 对象的引用(嵌套循环)。
注意,forloop 变量只在循环内部可用。模板解析器遇到 {% endfor %} 时,forloop 随之消失。
(4)注释标签
单行注释:{# 这是一个注释 #}
多行注释:{% comment %} 和 {% endcomment %}
(5)include 标签
{% include %} 标签允许在模板中包含其它的模板的内容。
(6)csrf_token 标签
{% csrf_token %} 标签用于跨站请求伪造保护。
(7)filter 标签
{% filter %} 标签通过一个或多个过滤器对内容过滤,多个过滤器使用管道符号相连接,且过滤器可以有参数。
(8)autoescape 标签
{% autoescape off %} 用于某块内容不需要自动转义。
(9)block 标签
{% block %} 定义一个块,该块能够被继承他的子模板重写。
(10)extends 标签
{% extends %} 子模块用来继承父模块。
(11)url 标签
{% url %} 引用路由配置的地址。
(12)load 标签
{% load staticfiles %} 加载静态文件。
3. 过滤器
模板过滤器可以在变量显示前修改它,过滤器使用管道字符,比如:{{ name|lower }}
模板继承
模板继承就是先构造一个基础框架模板,而后在其子模板中对它所包含站点公用部分和定义块进行重载。模板引擎发现了 {% extends %} 标签, 注意到该模板是一个子模板,模板引擎立即装载其父模板。