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]
-- Any Question,Please Email To [email protected]
更新: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. 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) 向浏览器直接输出字符串