zoukankan      html  css  js  c++  java
  • 4 Template层 -定义模板

    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 > 1
    • 过滤器能够被“串联”,构成过滤器链
    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 % }

     

  • 相关阅读:
    android 自己定义ViewGroup实现可记载并呈现选择的ListView
    【iOS】网络载入图片缓存与SDWebImage
    Android eclipse导入项目后出现Unable to resolve target 'android-17'解决方法
    leetcode 258: Add Digits
    Mahout算法调用展示平台2.1
    rgocaupbnxj
    代码问题配置
    Tomcat_startup
    Tomcat_shutdown
    Windows环境下Oracle数据库的自动备份脚本自动删除30天前的备份
  • 原文地址:https://www.cnblogs.com/venicid/p/8290464.html
Copyright © 2011-2022 走看看