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

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变量

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

5.4.4. include

{% include 'includes/nav.html' %}

如果给定的模板名不存在,Django将做下面两件事情中的一件:

1,如果DEBUG设置为True,你将看到一个TemplateDoesNotExist异常的错误页面

2,如果DEBUG设置为False,标签将什么也不显示

5.4.5. 注释

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

5.4.6. 使用模板文件

from django.template.loader import get_template  
from django.template import Context  
from django.http import HttpResponse  
import datetime  
def current_datetime(request):  
        now = datetime.datetime.now()  
        t = get_template('current_datetime.html')  
        html = t.render(Context({'current_date': now}))  
        return HttpResponse(html)  

或者更直接

from django.shortcuts import render_to_response  
import datetime  
def current_datetime(request):  
        now = datetime.datetime.now()  
        return render_to_response('current_datetime.html', {'current_date': now})  

如果你很懒或者你想保持代码整洁,使用Python内建的locals()方法返回一个包含当前作用域里面的所有变量和它们的值的字典

locals()导致了一点点开销,因为Python不得不动态创建字典,如果你手动指定context字典则可以避免这项开销

def current_datetime(request):  
        current_date = datetime.datetime.now()  
        return render_to_response('current_datetime.html', locals()) 

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) 向浏览器直接输出字符串