模板层基础

发布于 2019-10-25 17:50:50   阅读量 81  点赞 0  

1.模板系统

 存在多种不同的模板系统,不同的模板系统使用不同的模板语言。DTL 是 Django Template Language 的缩写,也是Django自带的模板语言;同时也可配置Django支持Jinja2等其他模板引擎,但作为Django的内置模板语言,DTL可以与Django无缝衔接而不会产生不兼容的情况。

   

2.DTL与普通HTML的区别

DTL模板是一种带特殊语法的HTML文件,该HTML可被Django编译,可以传递参数进去,实现数据动态化;DTL模板被编译后变成了一个普通的HTML文件,然后发送给客户端。

即模板是一种特殊.html文件

   

3.渲染模板

渲染模板有多种方式,以下介绍两种常用的方式: * 用在views.py中

Ⅰ. render_to_string( )函数

找到模板,然后将模板编译后渲染成Python的字符串格式,最后再通过HttpResponse()函数包装成一个 HttpResponse 对象返回回去。

render_to_string()函数渲染模板成字符串,HttpResponse()函数将字符串包装成HttpResponse对象。

其中render_to_string函数位于django.template.loader模块中

使用:render_to_string(模板路径字符串) 示例代码:

#views.py中
def book_detail (request)
    book_html = render_to_string("……/模板名.html")
    return HttpResponse(book_html)

   

Ⅱ. render( )函数

Django还提供了一个更加简便的方式,直接将模板渲染成字符串,同时包装成 HttpResponse 对象一步完成。

其中render()函数位于django.shortcuts模块中

使用render(request,模板路径字符串)

示例代码:

def book_detail(request):
    return render(request,"……/模板名.html")
views.py与模板的交互

通过render()render_to_string()函数的context关键字参数,该参数是一个字典,其中key是为模板定义的变量名的字符串,而value是views.py中的某个对象。

   

4.配置模板查找路径

在项目文件夹的 settings.py 配置文件中,有一个名为TEMPLATES的列表变量,该列表中包含了诸如模板引擎、模板查找路径、模板上下文等配置项。而模板路径可以在两个地方配置。

  1. DIR :其为一个列表,列表中存放所有的模板路径,以后在视图中使用render()render_to_string()函数渲染模板的时候,会在这个列表的路径中查找。  
  2. APP_DIRS :默认为True,当其设置为True后,会在 INSTALLED_APPS 配置的已安装的app的文件夹下的templates文件夹中查找模板。  
  3. 查找顺序: render()render_to_string()函数,会先在DIRS这个列表中依次查找路径下有无模板,如果有,则返回;若DISR中没有找到,则会先检查当前视图所在app有无安装,若已安装,则在当前app文件夹下的templates文件夹中查找模板,如果没有找到或当前app未安装,则会在其他已安装了的app文件夹中查找。如果所有路径都找不到模板,则抛出一个TemplateDoseNoExist的异常。

    模板文件夹只能命名为templates

想要进行在app文件夹下的查找,需在settings.py文件中将APP_DIRS设为True

   

5.模板变量的使用

变量的命名规范和Python的非常类似,只能是阿拉伯数字和英文字符以及下划线的组合,不能出现标点符号等特殊字符。

  • 变量通过视图函数渲染,视图函数在使用render()render_to_strng()函数的时候可以传递一个context字典参数,该字典的key是模板中使用的变量名称,而字典的value是变量的值。   ##### 点号解析顺序 模板中的变量支持 点 (·) 的形式访问。当出现了 (·) 的情况的时候(以 person.username 为例),模板按照以下方式解析:
  1. person是一个字典,则会查找该字典的username的key对应的值。  
  2. person是一个对象,则会查找该对象的username属性或是username方法。  
  3. 若出现的是person.n,会判断person是否是一个列表或元组或任意可通过下标访问的对象,若是的话则取整个列表的第n个值;若不是则获取到的是一个空字符串。    
    • 即使传入的对象是字典、列表等可迭代对象,也不能通过 [] 访问其内的元素,需通过 (·).  
    • 对于对象的方法通过对象.方法来调用,不用加( )。  
    • 对于字典:在给字典添加key的时候,不要与字典内置的属性重名。

      itemskeys是字典的方法,如果给字典添加名为 'items' 的键,则会覆盖字典原有的 items 方法。


Last Modified : 2020-03-09 17:50:50