Django 模板4.1

举报
Lansonli 发表于 2021/09/28 01:07:47 2021/09/28
【摘要】 模板介绍 作为Web框架,Django提供了模板,可以很便利的动态生成HTML模版系统致力于表达外观,而不是程序逻辑模板的设计实现了业务逻辑(view)与显示内容(template)的分离,一个视图可以使用任意一个模板,一个模板可以供多个视图使用模板包含 HTML的静态部分动态插入内容部分Django模板语言,简写DTL,定义在...

模板介绍

  • 作为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渲染模板

 
  • 加载渲染完整代码:

  
  1. from django.template import loader, RequestContext
  2. from django.http import HttpResponse
  3. def index(request):
  4. tem = loader.get_template('temtest/index.html')
  5. context = RequestContext(request, {})
  6. return HttpResponse(tem.render(context))

快捷函数

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

  
  1. from django.shortcuts import render
  2. def index(request):
  3. return render(request, 'temtest/index.html')

定义模板

  • 模板语言包括
    • 变量
    • 标签 { % 代码块 % }
    • 过滤器
    • 注释{# 代码或html #}

变量

  • 语法:

  
  1. {{ variable }}
  • 当模版引擎遇到一个变量,将计算这个变量,然后将结果输出
  • 变量名必须由字母、数字、下划线(不能以下划线开头)和点组成
  • 当模版引擎遇到点("."),会按照下列顺序查询:
    1. 字典查询,例如:foo["bar"]
    2. 属性或方法查询,例如:foo.bar
    3. 数字索引查询,例如:foo[bar]
  • 如果变量不存在, 模版系统将插入'' (空字符串)
  • 在模板中调用方法时不能传递参数

在模板中调用对象的方法

  • 在models.py中定义类HeroInfo

  
  1. from django.db import models
  2. class HeroInfo(models.Model):
  3. ...
  4. def showName(self):
  5. return self.hname
  • 在views.py中传递HeroInfo对象

  
  1. from django.shortcuts import render
  2. from models import *
  3. def index(request):
  4. hero = HeroInfo(hname='abc')
  5. context = {'hero': hero}
  6. return render(request, 'temtest/detail.html', context)
  • 在模板detail.html中调用

  
  1. {{hero.showName}}

标签

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

  
  1. { %for ... in ...%}
  2. 循环逻辑
  3. {{forloop.counter}}表示当前是第几次循环
  4. { %empty%}
  5. 给出的列表为或列表不存在时,执行此处
  6. { %endfor%}
  • if标签

  
  1. { %if ...%}
  2. 逻辑1
  3. { %elif ...%}
  4. 逻辑2
  5. { %else%}
  6. 逻辑3
  7. { %endif%}
  • comment标签

  
  1. { % comment % }
  2. 多行注释
  3. { % 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标签注释模版中的多行内容

示例

  • 查询所有英雄信息显示出来,要求奇数行显示为红色,偶数行显示为蓝色

 

文章来源: lansonli.blog.csdn.net,作者:Lansonli,版权归原作者所有,如需转载,请联系作者。

原文链接:lansonli.blog.csdn.net/article/details/100829624

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。