URLconf 配置
示例一
Python
1 |
urlpatterns = patterns('', |
2 |
(r '^hello/$' , 'mysite.views.hello' ), |
3 |
(r '^time/$' , 'mysite.views.current_datetime' ), |
4 |
(r '^time/plus/(\d{1,2})/$' , 'mysite.views.hours_ahead' ), |
5 |
(r '^tag/(\w+)/$' , 'weblog.views.tag' ), |
示例二
Python
1 |
urlpatterns = patterns( 'mysite.views' , |
2 |
(r '^hello/$' , 'hello' ), |
3 |
(r '^time/$' , 'current_datetime' ), |
4 |
(r '^time/plus/(\d{1,2})/$' , 'hours_ahead' ), |
7 |
urlpatterns + = patterns( 'weblog.views' , |
8 |
(r '^tag/(\w+)/$' , 'tag' ), |
示例三
Python
1 |
urlpatterns = patterns('', |
2 |
(r '^articles/(?P\d{4})/$' , views.year_archive), |
3 |
(r '^articles/(?P\d{4})/(?P\d{2})/$' , views.month_archive), |
6 |
urlpatterns + = patterns('', |
7 |
(r '^debuginfo/$' , views.debug), |
示例四
Python
1 |
urlpatterns = patterns('', |
2 |
(r '^foo/$' , views.foobar_view, { 'template_name' : 'template1.html' }), |
3 |
(r '^bar/$' , views.foobar_view, { 'template_name' : 'template2.html' }), |
示例五
Python
1 |
urlpatterns = patterns('', |
2 |
(r '^mydata/birthday/$' , views.my_view, { 'month' : 'jan' , 'day' : '06' }), |
3 |
(r '^mydata/(?P\w{3})/(?P\d\d)/$' , views.my_view), |
示例六 请求分支
Python
1 |
def some_page(request): |
2 |
if request.method = = 'POST' : |
3 |
do_something_for_post() |
4 |
return HttpResponseRedirect( '/someurl/' ) |
5 |
elif request.method = = 'GET' : |
7 |
return render_to_response( 'page.html' ) |
Python
01 |
from django.http import Http404, HttpResponseRedirect |
02 |
from django.shortcuts import render_to_response |
04 |
def method_splitter(request, GET = None , POST = None ): |
05 |
if request.method = = 'GET' and GET is not None : |
07 |
elif request.method = = 'POST' and POST is not None : |
11 |
def some_page_get(request): |
12 |
assert request.method = = 'GET' |
13 |
do_something_for_get() |
14 |
return render_to_response( 'page.html' ) |
16 |
def some_page_post(request): |
17 |
assert request.method = = 'POST' |
18 |
do_something_for_post() |
19 |
return HttpResponseRedirect( '/someurl/' ) |
23 |
from django.conf.urls.defaults import * |
24 |
from mysite import views |
26 |
urlpatterns = patterns('', |
28 |
(r '^somepage/$' , views.method_splitter, { 'GET' : views.some_page_get, 'POST' : views.some_page_post}), |
示例七
Python
01 |
def my_view1(request): |
02 |
if not request.user.is_authenticated(): |
03 |
return HttpResponseRedirect( '/accounts/login/' ) |
04 |
return render_to_response( 'template1.html' ) |
05 |
def my_view2(request): |
06 |
if not request.user.is_authenticated(): |
07 |
return HttpResponseRedirect( '/accounts/login/' ) |
08 |
return render_to_response( 'template2.html' ) |
09 |
def my_view3(request): |
10 |
if not request.user.is_authenticated(): |
11 |
return HttpResponseRedirect( '/accounts/login/' ) |
12 |
return render_to_response( 'template3.html' ) |
13 |
def requires_login(view): |
14 |
def new_view(request, * args, * * kwargs): |
15 |
if not request.user.is_authenticated(): |
16 |
return HttpResponseRedirect( '/accounts/login/' ) |
17 |
return view(request, * args, * * kwargs) |
19 |
- - - - - - - - - - - - - - - - - - - - - - - - - - |
20 |
urlpatterns = patterns('', |
21 |
(r '^view1/$' , requires_login(my_view1)), |
22 |
(r '^view2/$' , requires_login(my_view2)), |
23 |
(r '^view3/$' , requires_login(my_view3)), |
示例八:include()
被捕获的 username 变量将传递给被包含的 URLconf,进而传递给那个URLconf中的 每一个 视图函数。
Python
01 |
from django.conf.urls.defaults import * |
02 |
urlpatterns = patterns('', |
03 |
(r '^(?P\w+)/blog/' , include( 'foo.urls.blog' ) ,{ 'blogid' : 3 }), |
06 |
from django.conf.urls.defaults import * |
07 |
urlpatterns = patterns('', |
08 |
(r '^$' , 'foo.views.blog_index' ), |
09 |
(r '^archive/$' , 'foo.views.blog_archive' ), |
模板
django.template.RequestContext
RequestContext 默认地在模板context中加入了一些变量,如 HttpRequest 对象或当前登录用户的相关信息。 当你不想在一系例模板中都明确指定一些相同的变量时,你应该使用 RequestContext
全局模板变量
不论它们存放在哪个物理路径下,只要在你的Python搜索路径中,你就可以在 TEMPLATE_CONTEXT_PROCESSORS 设置里指向它们。 建议你把它们放在应用或者工程目录下名为 context_processors.py 的文件里。
默认的
Python
1 |
TEMPLATE_CONTEXT_PROCESSORS = ( |
2 |
'django.core.context_processors.auth' , |
3 |
'django.core.context_processors.debug' , |
4 |
'django.core.context_processors.i18n' , |
5 |
'django.core.context_processors.media' , |
可添加 django.core.context_processors.request
custom_proc: TEMPLATE_CONTEXT_PROCESSORS = (mysite.下面的文件名.custom_proc)
Python
01 |
from django.shortcuts import render_to_response |
02 |
from django.template import RequestContext |
04 |
def custom_proc(request): |
05 |
"A context processor that provides 'app', 'user' and 'ip_address'." |
09 |
'ip_address' : request.META[ 'REMOTE_ADDR' ] |
14 |
return render_to_response( 'template1.html' , |
15 |
{ 'message' : 'I am view 1.' }, |
16 |
context_instance = RequestContext(request, processors = [custom_proc])) |
20 |
return render_to_response( 'template2.html' , |
21 |
{ 'message' : 'I am the second view.' }, |
22 |
context_instance = RequestContext(request, processors = [custom_proc])) |
关闭模板自动转意: {{ data|safe }}
{% autoescape off %}
Hello {{ name }}
{% endautoescape %}
auto-escaping 标签的作用域不仅可以影响到当前模板还可以通过include标签作用到其他标签,就像block标签一样。
过滤器参数里的字符串常量的自动转义:{{ data|default:"3 < 2" }}
扩展模板系统:http://djangobook.py3k.cn/2.0/chapter09/
数据模型
http://djangobook.py3k.cn/2.0/chapter10/
访问外键(Foreign Key)值
Python
1 |
from mysite.apptest.models import Book |
2 |
b = Book.objects.get( id = 50 ) |
4 |
p = Publisher.objects.get(name = 'Apress1' ) |
5 |
print (p.book_set. all ()) |
访问多对多值(Many-to-Many Values)
多对多和外键工作方式相同,只不过我们处理的是QuerySet而不是模型实例
Python
1 |
b = Book.objects.get( id = 1 ) |
增加额外的Manager方法 我们为Book模型定义了一个title_count()方法
Python
1 |
class BookManager(models.Manager): |
2 |
def title_count( self , keyword): |
3 |
return self . filter (title__icontains = keyword).count() |
Python
1 |
class Book(models.Model): |
2 |
title = models.CharField(max_length = 100 ) |
3 |
authors = models.ManyToManyField(Author) |
4 |
publisher = models.ForeignKey(Publisher) |
5 |
publication_date = models.DateField() |
6 |
objects = BookManager() |
模型方法与属性: 执行原始SQL查询
connection和cursor几乎实现了标准Python DB-API
Python
1 |
>>> from django.db import connection |
2 |
>>> cursor = connection.cursor() |
7 |
>>> row = cursor.fetchone() |
通用视图
呈现静态“关于”页面的URLconf
Python
2 |
from django.conf.urls.defaults import * |
3 |
from django.views.generic.simple import direct_to_template |
5 |
urlpatterns = patterns('', |
6 |
(r '^about/$' , direct_to_template, { 'template' : 'about.html' }) |
7 |
(r '^about/(\w+)/$' , about_pages), |
对象的通用视图
Python
01 |
from django.conf.urls.defaults import * |
02 |
from django.views.generic import list_detail |
03 |
from apptest.apptest.models import Publisher |