1.模板介绍

  • 作为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")]

  (1)模板处理

  • 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))

  (2)快捷函数

  • 为了减少加载模板、渲染模板的重复代码,django提供了快捷函数
  • render_to_string("")
  • render(request,'模板',context)
from django.shortcuts import render

def index(request):
return render(request, 'temtest/index.html')

2.定义模板

  • 模板语言包括

    • 变量
    • 标签 { % 代码块 % }
    • 过滤器
    • 注释{# 代码或html #}

3. 变量  {{ variable }}

  • 语法:
{{ variable }}
  • 当模版引擎遇到一个变量,将计算这个变量,然后将结果输出
  • 变量名必须由字母、数字、下划线(不能以下划线开头)和点组成
  • 当模版引擎遇到点("."),会按照下列顺序查询:如果变量不存在, 模版系统将插入'' (空字符串)
字典查询,例如:foo["bar"]
对象的属性或方法查询,例如:foo.bar
数字索引查询,例如: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}}

4.标签 { % tag % }

  • 语法:{ % tag % }
  • 作用
    • 在输出中创建文本
    • 控制循环或逻辑
    • 加载外部信息到模板中供以后的变量使用

  (1)for标签

{ %for ... in ...%}
循环逻辑
{{forloop.counter}}表示当前是第几次循环
{ %empty%}
给出的列表为或列表不存在时,执行此处
{ %endfor%}

  (2)if标签

{ %if ...%}
逻辑1
{ %elif ...%}
逻辑2
{ %else%}
逻辑3
{ %endif%}

  (3)comment标签

{ % comment % }
多行注释
{ % endcomment % }

  (4)include:加载模板并以标签内的参数渲染

{ %include "foo/bar.html" % }

  (5)url:反向解析

{ % url 'name' p1 p2 %}

  

  (6)csrf_token:这个标签用于跨站请求伪造保护

{ % csrf_token %}
  • 布尔标签:and、or,and比or的优先级高
  • block、extends:详见“模板继承”
  • autoescape:详见“HTML转义”

5.过滤器

  • 语法:{ { 变量|过滤器 }},例如{ { name|lower }},表示将变量name的值变为小写输出
  • 使用管道符号 (|)来应用过滤器
  • 通过使用过滤器来改变变量的计算结果
  • 可以在if标签中使用过滤器结合运算符
if list1|length > 
  • 过滤器能够被“串联”,构成过滤器链
name|lower|upper
  • 过滤器可以传递参数,参数使用引号包起来
list|join:", "
  • default:如果一个变量没有被提供,或者值为false或空,则使用默认值,否则使用变量的值
value|default:"什么也没有"
  • date:根据给定格式对一个date变量格式化
value|date:'Y-m-d'
  • escape:详见“HTML转义”
  • 点击查看详细的过滤器

6.注释

  • 单行注释
{#...#}
  • 注释可以包含任何模版代码,有效的或者无效的都可以
{# { % if foo % }bar{ % else % } #}
  • 使用comment标签注释模版中的多行内容
{ % comment % }
多行注释
{ % endcomment % }

4 Template层 -定义模板的更多相关文章

  1. template 不能分别在.h和.cpp中定义模板

    先上代码: #ifndef SEQLIST_H #define SEQLIST_H #include <iostream> ; template <typename type> ...

  2. template <typename T>模板类定义

    #include "stdafx.h"#include "iostream"#include <ctime>using namespace std; ...

  3. 关于对ProgressBar定义模板的一些总结

    在之前的博客中曾经写到了一篇关于如何定义圆形进度条的文章,今天就ProgressBar再来进行一些总结,首先来介绍一下ProgressBar的结构,ProgressBar控件的模板有两个部分,我们在定 ...

  4. Django基础之视图(views)层、模板层

    目录 Django基础之视图(views)层.模板层 JsonResponse 向前端返回一个json格式字符串的两种方式 重写Django中的json的某个方法 form表单上传文件 FBV与CBV ...

  5. Django的视图层和模板层

    目录 一.视图层 1. 小白必会三板斧 2. JsonResponse 3. FBV与CBV 3.1 FVB 3.2 CBV 4. CBV的源码 5. 给CBV加装饰器 二.模板层 1. 模板语法 2 ...

  6. Expression Template(表达式模板,ET)

    1.前言 在前一篇文章自己实现简单的string类中提到在实现+操作符重载函数时,为了防止返回时生成的临时对象调用拷贝构造函数动态申请内存空间,使用了一个叫move的函数,它是C++0x新增的特性.既 ...

  7. ABP入门系列(4)——领域层定义仓储并实现

    一.先来介绍下仓储 仓储(Repository): 仓储用来操作数据库进行数据存取.仓储接口在领域层定义,而仓储的实现类应该写在基础设施层. 在ABP中,仓储类要实现IRepository接口,接口定 ...

  8. WPF中通过代码定义模板

    WPF中可以再XAML中定义模板,也可以通过C#代码定义模板,通过代码可能更清楚的看清其逻辑,而且代码的好处就是可以随时动态的去操作,而在XAML中定义的一般都是静态的. //控件呈现的显示内容1(这 ...

  9. c++中模板是什么?为什么要定义模板?

    一.c++中模板是什么? 首先: int Max(int x, int y) { return x > y ? x : y; } float Max(float a,float b) { ret ...

随机推荐

  1. @property的4类修饰符

    一.读写性修饰符:readwrite | readonly readwrite:表明这个属性是可读可写的,系统为我们创建这个属性的setter和getter方法. readonly:表明这个属性只能读 ...

  2. 一起来学Spring Cloud | 第一章 :如何搭建一个多模块的springcloud项目

    在spring cloud系列章节中,本来已经写了几个章节了,但是自己看起来有些东西写得比较杂,所以重构了一下springcloud的章节内容,新写了本章节,先教大家在工作中如何搭建一个多模块的spr ...

  3. bank conflct 一句话总结

    由于最新的多播模式区别于原来的广播模式,原来同一个warp不同线程访问同一个bank的相同地址不再是bank conflict, 现在总结为:只要同一个 warp 的不同线程会访问到同一个 bank ...

  4. Mysql数据库操作语句总结(三)

    最近一段时间重新学习一下mysql命令行的用法, 这里简单记录一下 参考文章: https://www.cnblogs.com/bluealine/p/7832219.html 个人使用的是mysql ...

  5. /etc/syslog.conf日志配置文件详解

    //将info或更高级别的消息送到/var/log/messages,除了mail以外. //其中*是通配符,代表任何设备:none表示不对任何级别的信息进行记录. *.info;mail.none; ...

  6. 命令行启动mysql服务

    在<计算机网络>课程中曾学过net命令,可以用于启动后台服务.在mysql中,net命令用于启动后台服务器进程mysqld,即后台服务. 不过,如果在普通用户模式下net start my ...

  7. linux打开文件数测试

    /proc/sys/kernel/threads-max 系统最大线程数量 /proc/sys/vm/max_map_count 限制一个进程可以拥有的VMA(虚拟内存区域)的数量 /proc/sys ...

  8. k8s之configmap配置中心

    记录在石墨笔记中,懒得再粘贴了,大家直接移步下面地址 https://shimo.im/docs/ktNM72QPweEEkcWg/

  9. NYOJ-198-数数

    原题地址 数数 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 我们平时数数都是喜欢从左向右数的,但是我们的小白同学最近听说德国人数数和我们有些不同,他们正好和我们相 ...

  10. World Wind Java开发之十一——加载热点信息(仿Google Earth)(转)

    在GE的图层中有一个照片图层,在浏览时可以看到各地的一些图片,我们称之为热点信息,如下图所示: 再来看下本文的实现效果: 效果是不是很像呢,其实实现这个很简单,参照examples中的Balloons ...