Django模板层介绍
Django使用内置的Django模板语言(简称DTL),不过也可以使用Jinja,就如在FLask中使用的那样(Flask使用Jinja2)。
在Flask博客,我介绍了关于模板的知识,详细请见 Flask的模板引擎介绍
模板最重要的几个概念:变量,标签和过滤器。DTL和Jinja的用法差不多,尤其是标签和过滤器,下面就分别简单地介绍一下。
1、变量
1)无效变量
Django模板处理无效变量和Flask中的JInja2不同,Django会认为无效的变量为空,即不显示,它不会抛出异常。但是JInja2不同,如果变量不存在,它会抛出异常,提示是无效的变量。
2)变量上下文的添加:
在Flask中,每一次调用模板,都会默认添加request,session,g,将这三个变量放到上下文中(详见 Flask模板实现原理 )。而在Django中,其实也一样,就是为了避免重复添加。Django中默认添加的变量有user,request,perms,debug等等。
user :一个 django.contrib.auth.models.User 实例,描述了当前登录用户(或者一个 AnonymousUser 实 例,如果客户端没有登录)。
messages :一个当前登录用户的消息列表(字符串)。 在后台,对每一个请求,这个变量都调用
request.user.get_and_delete_messages() 方法。 这个方法收集用户的消息然后把它们从数据库中删除。
perms : django.core.context_processors.PermWrapper 的一个实例,包含了当前登录用户有哪些权限。
request就是当前的request。
2、标签
如if,for等控制,判断语句的用法和JInja差不多。不过在Django中海油ifequal,ifchange的用法,例子如下:
{% ifequal variable 1 %} ,当然它也要有一个对应的endif。 这里要提到一个内建标签的不同用法,autoescape: Django:
{% autoescape on %}
自动转义在这块文本中是开启的。
{% endautoescape %}{% autoescape off %}
自动转义在这块文本中是关闭的。
{% endautoescape %}
Flask:
{% autoescape true %}
自动转义在这块文本中是开启的。
{% endautoescape %}{% autoescape false %}
自动转义在这块文本中是关闭的。
{% endautoescape %}
说一下用的比较多的几个标签:
1、with
使用一个简单地名字缓存一个复杂的变量,当你需要使用一个“昂贵的”方法(比如访问数据库)很多次的时候是非常有用的
例如:
{% with total=business.employees.count %}
{{ total }} employee{{ total|pluralize }}
{% endwith %}
{% 与 %}之间可用填充变量(上例中total t5>和{% endwith %}
你可以分配多个上下文变量:
{% with alpha=1 beta=2 %}
...
{% endwith %}
2、url 反向引用
返回一个路径的绝对引用。
{% url view-func-name args as t_url %}
2)、多行注释
如果要实现多行注释,可以使用 {% comment %}
模板标签,就像这样:
{% comment %}
This is a
multi‐line comment.
{% endcomment %}
3、过滤器
过滤器的用法是一样的,只是内置的过滤器可能不尽相同。Flask参考: Flask内置过滤器
Django参考: Django内置过滤器
render_to_response的技巧:
通常我们想定义一个或多个变量,然后传递给模板,通常做法是:
def current_datetime(request):
now = datetime.datetime.now()
return render_to_response('current_datetime.html', {'current_date': now})
如果有多个变量就分别参加。但还有一种技巧就是省去这些做法,那就是使用local()函数。
def current_datetime(request):
current_date = datetime.datetime.now()
return render_to_response('current_datetime.html', locals())
使用 locals() 时要注意是它将包括 所有 的局部变量,它们可能比你想让模板访问的要多。 在前例中, locals() 还包含了 request 。对此如何取舍取决你的应用程序。
模板方面的知识也是很多的,只能碰到的时候再去学习。
微信分享/微信扫码阅读