模板介绍
●作为Web框架,Django提供了模板,可以很便利的动态生成HTML
●模版系统致力于表达外观,而不是程序逻辑
●模板的设计实现了业务逻辑(view)与显示内容(template)的分离,一个视图可以使用任意一个模板,一个模板可以供多个视图使用
●模板包含
○HTML的静态部分
○动态插入内容部分
●Django模板语言,简写DTL,定义在django.template包中
●由startproject命令生成的settings.py定义关于模板的值:
○DIRS定义了一个目录列表,模板引擎按列表顺序搜索这些目录以查找模板源文件
○APP_DIRS告诉模板引擎是否应该在每个已安装的应用中查找模板
●常用方式:在项目的根目录下创建templates目录,设置DIRS值
DIRS=[os.path.join(BASE_DIR,"templates")]
模板处理
●Django处理模板分为两个阶段
●Step1 加载:根据给定的标识找到模板然后预处理,通常会将它编译好放在内存中
loader.get_template(template_name),返回一个Template对象
●Step2 渲染:使用Context数据对模板插值并返回生成的字符串
Template对象的render(RequestContext)方法,使用context渲染模板
●加载渲染完整代码:
from django.template import loader, RequestContext
from django.http import HttpResponse
def index(request):
tem = loader.get_template('temtest/index.html')
context = RequestContext(request, {})
return HttpResponse(tem.render(context))
快捷函数
●为了减少加载模板、渲染模板的重复代码,django提供了快捷函数
●render_to_string("")
●render(request,‘模板’,context)
from django.shortcuts import render
def index(request):
return render(request, 'temtest/index.html')
定义模板
●模板语言包括
○变量
○标签 { % 代码块 % }
○过滤器
○注释{# 代码或html #}
变量
●语法:
{{ variable }}
●当模版引擎遇到一个变量,将计算这个变量,然后将结果输出
●变量名必须由字母、数字、下划线(不能以下划线开头)和点组成
●当模版引擎遇到点("."),会按照下列顺序查询:
1、字典查询,例如:foo[“bar”]
2、属性或方法查询,例如:foo.bar
3、数字索引查询,例如:foo[bar]
●如果变量不存在, 模版系统将插入’’ (空字符串)
●在模板中调用方法时不能传递参数
在模板中调用对象的方法
●在models.py中定义类HeroInfo
from django.db import models
class HeroInfo(models.Model):
...
def showName(self):
return self.hname
●在views.py中传递HeroInfo对象
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}}
标签
●语法:{ % 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:详见“模板继承”
●autoescape:详见“HTML转义”
过滤器
●语法:{ { 变量|过滤器 }},例如{ { name|lower }},表示将变量name的值变为小写输出
●使用管道符号 (|)来应用过滤器
●通过使用过滤器来改变变量的计算结果
●可以在if标签中使用过滤器结合运算符
if list1|length > 1
●过滤器能够被“串联”,构成过滤器链
name|lower|upper
●过滤器可以传递参数,参数使用引号包起来
list|join:", "
●default:如果一个变量没有被提供,或者值为false或空,则使用默认值,否则使用变量的值
value|default:"什么也没有"
●date:根据给定格式对一个date变量格式化
value|date:'Y-m-d'
●escape:详见“HTML转义”
●点击查看详细的过滤器
注释
●单行注释
{#...#}
●注释可以包含任何模版代码,有效的或者无效的都可以
{# { % if foo % }bar{ % else % } #}
●使用comment标签注释模版中的多行内容
示例
●查询所有英雄信息显示出来,要求奇数行显示为红色,偶数行显示为蓝色