Django学习笔记之——Templates

简介:
模板
~~~~
顾名思意,就是一个通用的文档格式,等待填充动态的数据,形成完整的文档。
在Django里,模板通常用于制定HTML文档,但是它还可以用于任何文本格式。

如下为模板的示例:
templates/home.html
____________________________
<html>
<body>
<h1>Hello!</h1>
<p>My name is {{name}}.</p>
<p>Age: {{age}}.</p>
</body>
</html>
-----------------------------
用{{变量名}}表示会被动态赋值的变量

views.py
______________________________________________________
from django.http import HttpResponse
from django.template import loader, Context

def home(request):
    t = loader.get_template('home.html')
    #c = Context({'name':'Hevake Lee', 'age':26})
    c = Context()
    c['name'] = 'Hevake Lee'
    c['age'] = 26 
    content = t.render(c) # Template用Context生成正文
    return HttpResponse(content)
------------------------------------------------------
Context可以像dict那么访问。

如果说上面的过程太多,也可以用render_to_response()简化过程。
________________________________________________
from django.http import HttpResponse
from django.shortcuts import render_to_response

def home(request):
    response = render_to_response('home.html', 
            {'name':'Hevake Lee', 'age':26})
    return response
------------------------------------------------
render_to_response(template_file, context_dict),第一个参数是模板文件名称,
是相对于app_name/templates/的名称。第二个参数是正文字典,指定模板中的变量对
应的对象。

注意:转给模板的对象,在render()时都会被str(object)成字符串后替换模板中的变
量。如果发现变量显示不出来,请检查一下传入的对象是否实现__unicode__()之类的
转换函数。

模板过滤器
~~~~~~~~~~
模板框架可以通过叫过滤器(filter)的机制来对context变量进一步处理。

如下:
_________________________________
<ul>
{% for string in string_list %}
    <li>{{ string|lower }}</li>
{% endfor %}
</ul>
---------------------------------
用管道符"|",与Linux的管理有类似的意义。

默认的filter定义在 django/template/defaultfilters.py 中。
如下为lower()过滤器的定义:
_________________________
def lower(value):
    return value.lower()
-------------------------
lower接收一个源始的数据,返回一个处理后的数据。

lower是没有带参数的过滤器,也有带参数的。
比如truncatechars,它能限定字符显示长度,对于超出长度的字符用省略号表示。
如:"ABCDEFG",如果限定为5个,那么就是"AB..."
templates/truncate.html
________________________________
<p>{{text|truncatechars:5}}</p>
--------------------------------
filter的参数是以冒号":"开始。上面表示限制字符个数为5.

views.py
_______________________________________________________________________
def truncate(request):
    response = render_to_response('truncate.html', {'text':'ABCDEFGH'})
    return response
-----------------------------------------------------------------------
访问得到:
<p>AB...</p>

我们看一下filter truncatechars的定义:
_________________________________________
def truncatechars(value, arg):
    length = int(arg)
    return Truncator(value).chars(length)
-----------------------------------------
上面例子转入的value="ABCDEFGH", arg=5

看到这里,我们也就能理解filter究竟是怎么回事儿了。

控制标签
~~~~~~~~
除了{{变量名}}之外,还有控制逻辑的标签,它们都是{% xxxx %}格式的。
{% for item in list_or_tupe %} ... {% endfor %}

{% if %} ... {% endif %}
{% ifequal %} ... {% endifequal %}

{% block block_name %} ... {% endblock %}
{% extends file_name %}

{% include file_name %}

for语句
~~~~~~~
for语句中提供一个局部变量{{forloop}},它可以提供许多有用的信息。如:
{{forloop.first}},boolean,表示是否是第一个元素
{{forloop.last}},boolean,表示是否是最后一个元素
{{forloop.counter}},int,表示循环计数:1,2,3...
{{forloop.counter0}},int,表示循环计数:0,1,2...

block与extends
~~~~~~~~~~~~~~
{%block block_name%}...{%endblock%}中间的部分叫block。
{%extends "file_name"%}表示当前这个模块继承于file_name这个模板。
block的特性是,如果有其它的模板extends该模板,如有同名的block,那么就会用新
的block替代旧的block。这个有些类似C++里的类继承,子类可以重写父类的虚函数。

比如:
base.html
______________________________________
<html><body>
<p>{%block abc%}Base Page{%endblock%}</p>
</body></html>
--------------------------------------
定义了abc这个block。

extend.html
______________________________________
{%extends "base.html"%}
{%block abc%}Extend Page{%endblock%}
--------------------------------------
extend.html继承于base.html,并重新定义了block abc。

模板base.html生成的html:
__________________
<html><body>
<p>Base Page</p>
</body></html>
------------------
对应的extend.html生成的html为:
__________________
<html><body>
<p>Extend Page</p>
</body></html>
------------------

include包含
~~~~~~~~~~~
{%include "file_name"%}
这很像C/C++里的#inlcude,也像shell中的source,就是将指定文件的内容替换该语
句。

注:extend与include指令能接受字符串也能接受变量。这样就可以让模板动态地由上
下文决定要包含或继承于哪个模块了。
目录
相关文章
|
前端开发 JavaScript Python
Django如何使用templates显示网页和静态资源
Django如何使用templates显示网页和静态资源
|
6月前
|
Python
基于Django的Python应用—学习笔记—功能完善
基于Django的Python应用—学习笔记—功能完善
|
6月前
|
存储 数据库 数据安全/隐私保护
基于Django的Python应用——学习笔记
基于Django的Python应用——学习笔记
|
网络协议 前端开发 JavaScript
Django第3步_url路由映射与TEMPLATES添加检索路径
Django第3步_url路由映射与TEMPLATES添加检索路径
105 0
|
安全 中间件 开发者
【Django学习笔记 - 9】:装饰器在类视图中的使用、中间件(开发中间件)、知识点小补充(子应用的集中管理)
【Django学习笔记 - 9】:装饰器在类视图中的使用、中间件(开发中间件)、知识点小补充(子应用的集中管理)
387 5
【Django学习笔记 - 9】:装饰器在类视图中的使用、中间件(开发中间件)、知识点小补充(子应用的集中管理)
|
数据库 数据安全/隐私保护 Python
【Django学习笔记 - 19】:认证、自定义认证、权限、限流
【Django学习笔记 - 19】:认证、自定义认证、权限、限流
281 0
【Django学习笔记 - 19】:认证、自定义认证、权限、限流
|
缓存 前端开发 数据库
【Django学习笔记 - 18】:drf请求响应简介、基类(APIView、GenericAPIView)、mixin扩展类与三级视图、视图集与路由2
【Django学习笔记 - 18】:drf请求响应简介、基类(APIView、GenericAPIView)、mixin扩展类与三级视图、视图集与路由
165 0
【Django学习笔记 - 18】:drf请求响应简介、基类(APIView、GenericAPIView)、mixin扩展类与三级视图、视图集与路由2
|
XML JSON 前端开发
【Django学习笔记 - 18】:drf请求响应简介、基类(APIView、GenericAPIView)、mixin扩展类与三级视图、视图集与路由
【Django学习笔记 - 18】:drf请求响应简介、基类(APIView、GenericAPIView)、mixin扩展类与三级视图、视图集与路由
210 0
【Django学习笔记 - 18】:drf请求响应简介、基类(APIView、GenericAPIView)、mixin扩展类与三级视图、视图集与路由
|
XML JSON 前端开发
【Django学习笔记 - 17】:序列化和反序列化(restful接口小案例、DRF的工程搭建、序列化器与序列化、验证、保存)
【Django学习笔记 - 17】:序列化和反序列化(restful接口小案例、DRF的工程搭建、序列化器与序列化、验证、保存)
528 0
【Django学习笔记 - 17】:序列化和反序列化(restful接口小案例、DRF的工程搭建、序列化器与序列化、验证、保存)