django template 模板介绍以及使用

模板介绍

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

定义模板

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

      {{ variable }}  
    
  • 当模版引擎遇到一个变量,将计算这个变量,然后将结果输出

  • 变量名必须由字母、数字、下划线(不能以下划线开头)和点组成

  • 当模版引擎遇到点("."),会按照下列顺序查询:
    1.字典查询,例如:foo[“bar”]
    2.属性或方法查询,例如:foo.bar
    3.数字索引查询,例如:foo[bar]

  • 如果变量不存在, 模版系统将插入’’ (空字符串)

  • 在模板中调用方法时不能传递参数

标签
  • 语法:{ % 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转义”

  • 点击查看详细的过滤器

模板继承

  • 模板继承可以减少页面内容的重复定义,实现页面内容的重用

  • 典型应用:网站的头部、尾部是一样的,这些内容可以定义在父模板中,子模板不需要重复定义

  • block标签:在父模板中预留区域,在子模板中填充

  • extends继承:继承,写在模板文件的第一行

  • 定义父模板base.html

      { %block block_name%}   
      这里可以定义默认值
      如果不定义默认值,则表示空字符串
      { %endblock%}  
    
  • 定义子模板index.html

      { % extends "base.html" %}      
    
  • 在子模板中使用block填充预留区域

      { %block block_name%}         
      实际填充内容
      { %endblock%}  
    
说明
  • 如果在模版中使用extends标签,它必须是模版中的第一个标签

  • 不能在一个模版中定义多个相同名字的block标签

  • 子模版不必定义全部父模版中的blocks,如果子模版没有定义block,则使用了父模版中的默认值

  • 如果发现在模板中大量的复制内容,那就应该把内容移动到父模板中

  • 使用可以获取父模板中block的内容

  • 为了更好的可读性,可以给endblock标签一个名字

      { % block block_name %}
      区域内容
      { % endblock block_name %}  
    
2.创建分支模版
  • 继承自base.html

  • 名为“base_*.html”

  • 定义特定分支共用的内容

  • 定义base_goods.html

      {%extends 'temtest/base.html'%}
      {%block title%}商品{%endblock%}
      {%block left%}
      <h1>goods left</h1>
      {%endblock%}  
    
  • 定义base_user.html

      {%extends 'temtest/base.html'%}
      {%block title%}用户中心{%endblock%}
      {%block left%}
      <font color='blue'>user left</font>
      {%endblock%}  
    
  • 定义index.html,继承自base.html,不需要写left块

      {%extends 'temtest/base.html'%}
      {%block content%}  
    
  • 首页内容

      {%endblock content%}  
    
4.视图调用具体页面,并传递模板中需要的数据
  • 首页视图index

      logo='welcome to itcast'
      def index(request):
          return render(request, 'temtest/index.html', {'logo': logo})  
    
  • 商品列表视图goodslist

      def goodslist(request):
          return render(request, 'temtest/goodslist.html', {'logo': logo})
    
  • 用户密码视图userpwd

      def userpwd(request):
          return render(request, 'temtest/userpwd.html', {'logo': logo})  
    
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值