Differences between revisions 11 and 13 (spanning 2 versions)
Revision 11 as of 2007-06-07 13:55:53
Size: 2438
Editor: zuroc
Comment:
Revision 13 as of 2007-06-07 17:37:41
Size: 6252
Editor: zuroc
Comment:
Deletions are marked like this. Additions are marked like this.
Line 35: Line 35:
Line 79: Line 80:

插入变量
=== 传入参数 ===

{{{
from django.template import Context, Template
t = Template("My name is {{name}}.")
c = Context({"name": "Stephane"})
t.render(c)

}}}
输出
{{{
'My name is Stephane.'
}}}
渲染的对象还可以是,字典
{{{
 person = {'name': 'Sally', 'age': '43'}
}}}
对应的模板为
{{{
{{ person.name }} is {{ person.age }} years old.'
}}}


{{{
class Person(object):
 def __init__(self,first_name,last_name):
  self.first_name, self.last_name = first_name, last_name
}}}
对于的模板和上面类似

对于类似
Contexst({'items': ['apples', 'bananas', 'carrots']})
的数组
items.2就表示carrots

默认情况下如果变量不存在,模板系统会把它渲染成空string
=== 调用对象的方法 ===
如对于Context({'var': '123ss'})可以在模板中用var.upper来调用upper()方法,被调用的方法不能有参数

如果一个方法触发了异常,会致渲染失败.

如果异常有一个值为True的silent_variable_failure属性,这个变量会渲染成空string
{{{
class SilentAssetionError(AssertionError):
 silent_variable_failure = True

class PersonClass4:
 def first_name(self):
  raise SilentAssertionError

p = PersonClass4()

#将被渲染为空字串
t.render(Context({"person": p}))
}}}

设置方法的alters_data属性为true可以禁止在模板中调用该方法
{{{
def delete(self):
 pass
delete.alters_data = True
}}}
=== 插入变量 ===
Line 85: Line 147:
块语句 === 块语句 ===

==== if ====
{% if %}标签不允许同一标签里同时出现and和or

可以使用嵌套的{% if %}来表示and和or
 
Line 93: Line 161:

过滤器
==== ifequal/ifnotequal ====
{{{
{% ifequal user currentuser %}
<h1>Welcome!</h1>
{% endifequal %}
}}}

参数可以是硬编码的string,数字等,如{% ifequal section 'sitenews' %},{% ifequal section 1.3 %}
==== for ====
{% for %}标签允许你按顺序遍历一个序列中的各个元素

{{{
<ul>
{% for athlete in athlete_list %}
 <li>{{ athlete.name }}</li>
{% endfor %}
</ul>
}}}

在标签里添加reversed来反序循环列表,如{% for athlete in athlete_list reversed %}

{% for %}标签内置了一个forloop变量
 * forloop.counter表示循环的次数,从1开始计数
 * forloop.counter0类似于forloop.counter,但它是从0开始计数
 * forloop.revcounter表示循环中剩下的items数量,第一次循环时设为items总数,最后一次设为1
 * forloop.revcounter0类似于forloop.revcounter,但它是表示的数量减一,即最后一次循环时设为0
 * forloop.first当第一次循环时值为True,在特别情况下很有用
{{{
{% for object in objects %}
 {% if forloop.first %}<li class="first">{% else %}<li>{% endif %}
  {{ object }}
 </li>
{% endfor %}
}}}
 * forloop.last当最后一次循环时值为True
 * forloop.parentloop在嵌套循环中表示父循环的forloop

==== 注释 ====
{# This is a comment #}
模板渲染时注释不会输出,一个注释不能分成多行
 
=== 过滤器 ===

==== date ====
把ship_date变量传递给过滤器,并给date过滤器传递了一个参数“F j, Y”,date过滤器以给定参数的形式格式化日期
Line 98: Line 209:
==== escape / linebreaks ====
escape转义给定的string里出现的&符,引号,尖括号

常用于处理用户提交的数据和确认合法的XML和XHTML数据

escape文本内容然后把换行转换成p标签
{{{
{{ my_text|escape|linebreaks }}
}}}

显示bio变量的前30个字,过滤器参数一直使用双引号
{{{
{{ bio|truncatewords:"30" }}
}}}

==== addslashed ====
在任何后斜线,单引号,双引号前添加一个后斜线,常用于输出文本到JavaScript字符串

==== length ====
返回值的长度,你可以在一个list或string上做此操作

Django绝对简明手册(写作中) TableOfContents

张沈鹏     电子科技大学  生物医学工程/计算机科学与技术
你看到的此文档,可能不是最新的,
欢迎访问我的 Blog 了解最新的变化.
也欢迎加入我的Google讨论群,
讨论一切关于
C++,STL,Boost,
XML,CSS,Javascript,XUL
Python,Django
的问题

[http://groups.google.com/group/go2program 我的Google讨论群] [http://zsp.javaeye.com 我的Blog]

更新:2007.6 beta

  • Django版本:9.6
  • Python版本:2.5

1. 序言

现在学的东西很容易忘记,写这篇文章的目的是能让我在需要时快速找回当时的感觉. Find Fun !

许多细节在<<Django Step by Step>>中有介绍,我不重复.

2. 辅助工具

文本替换专家2.5 : 修改站名,APP模块名时用得到

3. View函数

向浏览器输出html等的函数.

from django.http import HttpResponse  
import datetime  

#View函数的第一个参数总是HttpRequest对象
#offset是一个string,值由url正则表达式匹配而得。
def hours_ahead(request, offset):  
   offset = int(offset)  
   dt = datetime.datetime.now() + datetime.timedelta(hours=offset)  
   html = "In %s hour(s), it will be %s." % (offset, dt)  
   return HttpResponse(html) 

4. Url匹配

(r'^now/plus\d+hours/$', hours_ahead)

可以匹配

/now/plus2hours/
/now/plus125hours/
/now/plus100000000000hours/

限制最多99小时,即只允许1个或2个数字

(r'^now/plus(\d{1,2})hours/$', hours_ahead)

常用正则表达式

.    任意字符  
\d        任意数字  
[A-Z]     从A到Z的任意字符(大写)  
[a-z]     从a到z的任意字符(小写)  
[A-Za-z]  从a到z的任意字符(大小写不敏感)  
[^/]+     任意字符直到一个前斜线(不包含斜线本身)  
+         一个或多个前面的字符  
?         零个或多个前面的字符  
{1,3}     1个到3个之间前面的字符(包括1和3)  

5. 模版

5.1. 传入参数

from django.template import Context, Template  
t = Template("My name is {{name}}.")  
c = Context({"name": "Stephane"})  
t.render(c)  

输出

'My name is Stephane.' 

渲染的对象还可以是,字典

 person = {'name': 'Sally', 'age': '43'}  

对应的模板为

{{ person.name }} is {{ person.age }} years old.' 

class Person(object):
        def __init__(self,first_name,last_name):
                self.first_name, self.last_name = first_name, last_name  

对于的模板和上面类似

对于类似 Contexst({'items': ['apples', 'bananas', 'carrots']}) 的数组 items.2就表示carrots

默认情况下如果变量不存在,模板系统会把它渲染成空string

5.2. 调用对象的方法

如对于Context({'var': '123ss'})可以在模板中用var.upper来调用upper()方法,被调用的方法不能有参数

如果一个方法触发了异常,会致渲染失败.

如果异常有一个值为True的silent_variable_failure属性,这个变量会渲染成空string

class SilentAssetionError(AssertionError):  
        silent_variable_failure = True  

class PersonClass4:  
        def first_name(self):  
                raise SilentAssertionError

p = PersonClass4()  

#将被渲染为空字串
t.render(Context({"person": p}))  

设置方法的alters_data属性为true可以禁止在模板中调用该方法

def delete(self):
        pass
delete.alters_data = True

5.3. 插入变量

<p>Sincerely,<br />{{ 变量名 }}</p>

5.4. 块语句

5.4.1. if

{% if %}标签不允许同一标签里同时出现and和or

可以使用嵌套的{% if %}来表示and和or

{%if xxx%}
        <p>内容1</p>
{%else%}
        <p>内容2</p>
{%endif%}

5.4.2. ifequal/ifnotequal

{% ifequal user currentuser %}
<h1>Welcome!</h1>
{% endifequal %}  

参数可以是硬编码的string,数字等,如{% ifequal section 'sitenews' %},{% ifequal section 1.3 %}

5.4.3. for

{% for %}标签允许你按顺序遍历一个序列中的各个元素

<ul>  
{% for athlete in athlete_list %}  
        <li>{{ athlete.name }}</li>  
{% endfor %}  
</ul>  

在标签里添加reversed来反序循环列表,如{% for athlete in athlete_list reversed %}

{% for %}标签内置了一个forloop变量

  • forloop.counter表示循环的次数,从1开始计数
  • forloop.counter0类似于forloop.counter,但它是从0开始计数
  • forloop.revcounter表示循环中剩下的items数量,第一次循环时设为items总数,最后一次设为1
  • forloop.revcounter0类似于forloop.revcounter,但它是表示的数量减一,即最后一次循环时设为0
  • forloop.first当第一次循环时值为True,在特别情况下很有用

{% for object in objects %}  
        {% if forloop.first %}<li class="first">{% else %}<li>{% endif %}  
                {{ object }}  
        </li>  
{% endfor %}  

  • forloop.last当最后一次循环时值为True
  • forloop.parentloop在嵌套循环中表示父循环的forloop

5.4.4. 注释

{# This is a comment #} 模板渲染时注释不会输出,一个注释不能分成多行

5.5. 过滤器

5.5.1. date

把ship_date变量传递给过滤器,并给date过滤器传递了一个参数“F j, Y”,date过滤器以给定参数的形式格式化日期

{{ship_date|date:"F j, Y"}}

5.5.2. escape / linebreaks

escape转义给定的string里出现的&符,引号,尖括号

常用于处理用户提交的数据和确认合法的XML和XHTML数据

escape文本内容然后把换行转换成p标签

{{ my_text|escape|linebreaks }}  

显示bio变量的前30个字,过滤器参数一直使用双引号

{{ bio|truncatewords:"30" }}

5.5.3. addslashed

在任何后斜线,单引号,双引号前添加一个后斜线,常用于输出文本到JavaScript字符串

5.5.4. length

返回值的长度,你可以在一个list或string上做此操作

6. 常用函数一览

django.http.HttpResponse(string) 向浏览器直接输出字符串

DjangoZipManual (last edited 2009-12-25 07:10:12 by localhost)