# 定义模板
* 模板语言包括
* 变量
* 标签{百分号 代码块 百分号}
* 过滤器
* 注释{\#代码或HTML\#}
## 变量
* 语法
```text
{{variable}}
```
* 当模板引擎要一个变量,将计算这个变量,然后将结果输出
* 变量名必须由字母、数字、下划线\(不能以下划线开头\)和点组成
* 当模板引擎遇到点\("."\),会按照下列顺序查询:
* 1.字典查询,例如:key\['value'\]
* 2.属性或方法查询:例如key.value
* 3.数字索引查询,例如:key\[value\]
* 如果变量不存在,模板系统将插入\(空字符串\)""
* 在模板中调用方法时不能传递参数
## 在模板中调用对象的方法
* 在models.py中定义类Grades
```text
from django.db import models
# Create your models here.
class GradesManager(models.Manager):
def get_queryset(self):
return super(GradesManager,self).get_queryset().filter(isDelete=False)
def createGrades(self,name,date,gril,boy,isDel):
g = self.model()
g.gname = name
g.gdate = date
g.ggrilnum = gril
g.gboynum = boy
g.isDelete = isDel
return g
class Grades(models.Model):
gObj = GradesManager()
gname = models.CharField(max_length=20)
gdate = models.DateField()
ggirlnum = models.IntegerField()
gboynum = models.IntegerField()
isDelete = models.BooleanField(default=False)
```
* 在views.py中传递Grades对象
```text
from django.shortcuts import render
from django.shortcuts import *
# Create your views here.
def index(request):
context = {'hello':'hello world'}
return render(request,'myapp/index.html',context)
```
* 在模板index.html中调用
```text
{{ hello }}
```
## 标签
* 语法:{百分号tag百分号}
* 作用
* 在输出中创建文本
* 控制循环或逻辑
* 加载外部信息到模板中供以后的变量使用
* for标签
```text
{%for ... in ...%}
循环逻辑
{{forloop.counter}}标识当前是第几次循环
{%empty%}
给出的列表为列表不存在时,执行此处
{%endfor%}
```
* if标签
```text
{%if ...%}
逻辑
{%elif ...%}
逻辑
{%else%}
逻辑
{%endif%}
```
* comment标签
```text
{% comment %}
多行注释
{% endcomment %}
```
* include:加载模板并以标签内的参数渲染
```text
{%include "myapp/footer.html" %}
```
* url:反向解析
```text
{% url 'app:name' p1 p2%}
```
* crst\_token:这个标签用于跨站请求伪造保护
```text
{%crsf_token%}
```
* 布尔标签:and、or、and比or的优先级高
* block、extends:详见"继承模板"
* autoescape:详见"HTML"转义
## 过滤器
* 语法:,例如,表示将变量name的值变为小写输出
* 使用管道符号\\(\\|\\)来应用过滤器
* 通过使用过滤器来改变变量的计算结果
* 可以在if标签中过滤器结合运算符
```text
if list|length > 1
```
* 过滤器能够被"串联",构成过滤器链
```text
name|lower|upper
```
* 过滤器可以传递参数,参数使用引号包起来
```text
list:join:","
```
* default:如果一个变量没有被提供,或者为fals额或空,则使用默认值,否则使用变量的值
```text
value|default:"没有初始化"
```
* date:根据给定格式一个date变量格式化
```text
value|date:"Y-m-d"
```
* escape:详见"HTML转义"
* 详细的过滤器
* value\|add:number
```text
<h1>
num = {{num}}
</h1>
<h1>
num = {{num|add:10}}
</h1>
<h1>
num = {{num|add:-5}}
</h1>
```
* -- 乘法
* num/1\*5
```text
# num={%widthratio num 1 5%}
# num={%widthratio num 5 1%}
```
## 注释
* 单行注释
```text
{#....#}
```
* 注释可以包含任何模板代码,有效的或者无效的都可以
```text
{{#{% if a %}bar{%else%}#}
```
* 示例:查询所有班级,要求奇数行显示红色,偶数行显示为蓝色
```text
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>
Title
</title>
</head>
<body>
<ul>
{# {{ grades }}#}
{% for grade in grades%}
{% if forloop.counter|divisibleby:2 %}
<li style="background-color: green">
{% else %}
<li style="background-color: pink">
{% endif %}
{{ grade.gname }} -- {{ grade.gdate }}
{%empty%}
目前没有信息
</li>
{% endfor %}
</ul>
</body>
</html>
```
额外知识点
```text
forloop.counter 索引从 1 开始算
forloop.counter0 索引从 0 开始算
forloop.revcounter 索引从最大长度到 1
forloop.revcounter0 索引从最大长度到 0
forloop.first 当遍历的元素为第一项时为真
forloop.last 当遍历的元素为最后一项时为真
forloop.parentloop 用在嵌套的 for 循环中,获取上一层for 循环的 forloop
```