定义模板
1.模板语言包括
①变量
②标签 { % 代码块 % }
③过滤器
④注释{# 代码或html #}
2.变量
语法:
{{ variable }}
①当模版引擎遇到一个变量,将计算这个变量,然后将结果输出
②变量名必须由字母、数字、下划线(不能以下划线开头)和点组成
③当模版引擎遇到点("."),会按照下列顺序查询:
字典查询,例如:foo["bar"]
属性或方法查询,例如:foo.bar
数字索引查询,例如:foo[bar]
④如果变量不存在, 模版系统将插入(空字符串)
⑤在模板中调用方法时不能传递参数
3.在模板中调用对象的方法
①在models.py中定义类BlogInfo
from django.db import models
class BlogInfo(models.Model):
...
def showName(self):
return self.hname
②在views.py中传递BlogInfo对象
from django.shortcuts import render
from models import *
def index(request):
hero = HeroInfo(hname='abc')
context = {'hero': hero}
return render(request, 'temtest/detail.html', context)
③在模板detail.html中调用
{{hero.showName}}
4.标签
语法:{ % tag % }
作用
在输出中创建文本
控制循环或逻辑
加载外部信息到模板中供以后的变量使用
①for标签
{ %for ... in ...%}
# 循环逻辑
{{forloop.counter}} # 表示当前是第几次循环
{ %empty%}
# 给出的列表为或列表不存在时,执行此处
{ %endfor%}
②if标签
{ %if ...%}
# 逻辑1
{ %elif ...%}
# 逻辑2
{ %else%}
# 逻辑3
{ %endif%}
③comment标签
{ % comment % }
# 多行注释
{ % endcomment % }
④include:加载模板并以标签内的参数渲染
{ % include "foo/bar.html" % }
⑤url:反向解析
{ % url 'name' p1 p2 %}
⑥csrf_token:这个标签用于跨站请求伪造保护
{ % csrf_token %}
⑦布尔标签:and、or,and比or的优先级高
⑧block、extends:详细描述在“模板继承”
5.过滤器
语法:{ { 变量|过滤器 }},例如{ { name|lower }},表示将变量name的值变为小写输出
使用管道符号 (|)来应用过滤器
通过使用过滤器来改变变量的计算结果
①可以在if标签中使用过滤器结合运算符
if list1|length > 1
②过滤器能够被“串联”,构成过滤器链
name|lower|upper
③过滤器可以传递参数,参数使用引号包起来
list|join:", "
③default:如果一个变量没有被提供,或者值为false或空,则使用默认值,否则使用变量值
value|default # 什么也没有
④date:根据给定格式对一个date变量格式化
value|date:'Y-m-d'
模板继承
1.模板继承
①模板继承可以减少页面内容的重复定义,实现页面内容的重用
②典型应用:网站的头部、尾部是一样的,这些内容可以定义在父模板中,子模板不需要重复定义
③block标签:在父模板中预留区域,在子模板中填充
④extends继承:继承,写在模板文件的第一行
⑤定义父模板base.html
{ %block block_name%}
# 这里可以定义默认值
# 如果不定义默认值,则表示空字符串
{ %endblock%}
⑥定义子模板index.html
{ % extends "base.html" %}
# 在子模板中使用block填充预留区域
{ %block block_name%}
# 实际填充内容
{ %endblock%}
2.说明
①如果在模版中使用extends标签,它必须是模版中的第一个标签
②不能在一个模版中定义多个相同名字的block标签
③子模版不必定义全部父模版中的blocks,如果子模版没有定义block,则使用了父模版中的默认值
④如果发现在模板中大量的复制内容,那就应该把内容移动到父模板中
⑤使用可以获取父模板中block的内容
⑥为了更好的可读性,可以给endblock标签一个名字
{ % block block_name %}
# 区域内容
{ % endblock block_name %}