创建模板对象并渲染
-
>>> from django.template import Context, Template
-
>>> t = Template('My name is {{ name }}.')
-
>>> c = Context({'name': 'Stephane'})
-
>>> t.render(c)
-
u'My name is Stephane.'
深度变量的查找(点的用法)
-
>>> from django.template import Template, Context
-
>>> person = {'name': 'Sally', 'age': '43'}
-
>>> t = Template('{{ person.name }} is {{ person.age }} years old.')
-
>>> c = Context({'person': person})
-
>>> t.render(c)
-
u'Sally is 43 years old.'
自定义一个类,以点访问之
点击(此处)折叠或打开
-
>>> from django.template import Template, Context
-
>>> class Person(object):
-
... def __init__(self, first_name, last_name):
-
... self.first_name, self.last_name = first_name, last_name
-
>>> t = Template('Hello, {{ person.first_name }} {{ person.last_name }}.')
-
>>> c = Context({'person': Person('John', 'Smith')})
-
>>> t.render(c)
-
u'Hello, John Smith.'
点语法也可以用来引用对象的方法
点击(此处)折叠或打开
-
>>> from django.template import Template, Context
-
>>> t = Template('{{ var }} -- {{ var.upper }} -- {{ var.isdigit }}')
-
>>> t.render(Context({'var': 'hello'}))
-
u'hello -- HELLO -- False'
-
>>> t.render(Context({'var': '123'}))
-
u'123 -- 123 -- True'
点也可用于访问列表索引。不允许使用负数列表索引,像 {{ items.-1 }} 这样的模板变量将会引发`` TemplateSyntaxError``。
点击(此处)折叠或打开
-
>>> from django.template import Template, Context
-
>>> t = Template('Item 2 is {{ items.2 }}.')
-
>>> c = Context({'items': ['apples', 'bananas', 'carrots']})
-
>>> t.render(c)
-
u'Item 2 is carrots.'
基本的模板标签和过滤器
{% if %} 标签检查一个变量,如果这个变量为真(即,变量存在,非空,不是布尔值假),系统会显示在 {% if %} 和 {% endif %} 之间的任何内容。
{% if %} 标签接受 and , or 或者 not 关键字来对多个变量做判断 ,或者对变量取反( not )
点击(此处)折叠或打开
-
{% if today_is_weekend %}
-
<p>Welcome to the weekend!>
-
{% else %}
-
<p>Get back to work.</p>
-
{% endif %}
{% for %} 允许我们在一个序列上迭代
-
<ul>
-
{% for athlete in athlete_list %}
-
<li>{{ athlete.name }}</li>
-
{% endfor %}
-
</ul>
给标签增加一个 reversed 使得该列表被反向迭代:
点击(此处)折叠或打开
-
{% for athlete in athlete_list reversed %}
-
...
-
{% endfor %}
`` for`` 标签支持一个可选的`` {% empty %}`` 分句,通过它我们可以定义当列表为空时的输出内容
-
{% for athlete in athlete_list %}
-
<p>{{ athlete.name }}</p>
-
{% empty %}
-
<p>There are no athletes. Only computer programmers.</p>
-
{% endfor %}
Django不支持退出循环操作。 如果我们想退出循环,可以改变正在迭代的变量,让其仅仅包含需要迭代的项目。在每个`` {% for %}``循环里有一个称为`` forloop`` 的模板变量。这个变量有一些提示循环进度信息的属性。
这个计数器是从1开始的,所以在第一次循环时 forloop.counter 将会被设置为1。
点击(此处)折叠或打开
-
{% for item in todo_list %}
-
<p>{{ forloop.counter }}: {{ item }}</p>
-
{% endfor %}
ifequal/ifnotequal 只有模板变量,字符串,整数和小数可以作为 {% ifequal %} 标签的参数。
-
{% ifequal section 'sitenews' %}
-
<h1>Site News</h1>
-
{% else %}
-
<h1>No News Here</h1>
-
{% endifequal %}
注释
单行:{# This is a comment #}
多行注释,使用`` {% comment %}`` 模板标签
{% comment %}
This is a
multi-line comment.
{% endcomment %}
过滤器
模板过滤器是在变量被显示前修改它的值的一个简单方法。 过滤器使用管道字符。
实现查找列表的第一个元素并将其转化为大写。
{{ my_list | first | upper }}
有些过滤器有参数。 过滤器的参数跟随冒号之后并且总是以双引号包含。
{{ bio | truncatewords:"30" }} 显示变量 bio 的前30个词
addslashes : 添加反斜杠到任何反斜杠、单引号或者双引号前面。 这在处理包含JavaScript的文本时是非常有用的。
date : 按指定的格式字符串参数格式化 date 或者 datetime 对象, 范例:
{{ pub_date|date:"F j, Y" }}
在视图中使用模板
模板加载
在settings.py里加入:
TEMPLATE_DIRS = (
'/home/django/mysite/templates',os.path.join(os.path.dirname(__file__), 'templates').replace('\\', '/'),
)
改变views.py
-
def current_datetime(request):
-
current_date = datetime.datetime.now()
-
-
return render_to_response('mytemplate.html', locals())
其中,locals()技巧代替了原有的局部变量now
include 模板标签
该标签允许在(模板中)包含其它的模板的内容。 标签的参数是所要包含的模板名称,可以是一个变量,也可以是用单/双引号硬编码的字符串。 每当在多个模板中出现相同的代码时,就应该考虑是否要使用 {% include %} 来减少重复。
{% include template_name %} 包含了以变量 template_name 的值为名称的模板
模板继承 目的:减少共用页面区域(比如站点导航)所引起的重复和冗余代码
第一步:定义 基础模板,该框架之后将由子模板所继承。
base.html
点击(此处)折叠或打开
-
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
-
<html lang="en">
-
<head>
-
<title>{% block title %}{% endblock %}</title>
-
</head>
-
<body>
-
<h1>My helpful timestamp site</h1>
-
{% block content %}{% endblock %}
-
{% block footer %}
-
<hr>
-
<p>Thanks for visiting my site.</p>
-
{% endblock %}
-
</body>
-
</html>
所有的 {% block %} 标签告诉模板引擎,子模板可以重载这些部分。
然后修改mytemplate.html
点击(此处)折叠或打开
-
{% extends "base.html" %}
-
-
{% block title %}The current time{% endblock %}
-
-
{% block content %}
-
<p>It is now {{ current_date }}.</p>
-
{% endblock %}
继承并不会影响到模板的上下文。 换句话说,任何处在继承树上的模板都可以访问到你传到模板中的每一个模板变量。
OK!你可以展示你定制的模板了!
参考文档:
这些文章,是在项目紧张的时候边学边写的,更多的是作为自己的笔记用,如果有什么问题,可以留言讨论学习。
阅读(138) | 评论(0) | 转发(0) |