urlpatterns = patterns('',
(r'^hello/$', 'mysite.views.hello'),
(r'^time/$', 'mysite.views.current_datetime'),
(r'^time/plus/(\d{1,2})/$', 'mysite.views.hours_ahead'),
(r'^tag/(\w+)/$', 'weblog.views.tag'),
)
写成:
from django.conf.urls.defaults import *
urlpatterns = patterns('mysite.views',
(r'^hello/$', 'hello'),
(r'^time/$', 'current_datetime'),
(r'^time/plus/(\d{1,2})/$', 'hours_ahead'),
)
urlpatterns += patterns('weblog.views',
(r'^tag/(\w+)/$', 'tag'),
)
2、URL正则匹配
如果请求的方法含有参数
def home(request, year='', month='01'):
则访问的URL可以写成:
url(r'^(\d{4})/(\d{2})$', 'hello.views.home')
这个可以用在:举个例子来说,一般的博客都喜欢以这样的url命名自己的博文:/year/month/day/xxx.html。如果我们按照我们前面所说的做,
需要为每个日志设计url映射,这显然是不科学的,如果我们可以在确定展示什么内容之前确定用户请求里的year,month等信息的话,问题便迎刃而解了。
3、URL使用命名组:
还是上面那个请求方法,URL可以写成:
url(r'^(?P<year>\d{4})/(?P<month>\d{2})$', 'hello.views.home')
或者
url(r'^(?P<month>\d{2})/(?P<year>\d{4})$', 'hello.views.home')
相对于第二点来说,优点很明显,不会混乱参数赋值顺序。
4、URL参数传递:
还可以写成:
url(r'^/$', 'hello.views.home',{'year':2013,'month':09})
这个又有什么用呢?来看:
以这段代码作为例子:
# urls.py
from django.conf.urls.defaults import *
from mysite import views
urlpatterns = patterns('',
(r'^events/$', views.event_list),
(r'^blog/entries/$', views.entry_list),
)
# views.py
from django.shortcuts import render_to_response
from mysite.models import Event, BlogEntry
def event_list(request):
obj_list = Event.objects.all()
return render_to_response('mysite/event_list.html', {'event_list': obj_list})
def entry_list(request):
obj_list = BlogEntry.objects.all()
return render_to_response('mysite/blogentry_list.html', {'entry_list': obj_list})
这两个视图做的事情实质上是一样的: 显示一系列的对象。 让我们把它们显示的对象的类型抽象出来:
# urls.py
from django.conf.urls.defaults import *
from mysite import models, views
urlpatterns = patterns('',
(r'^events/$', views.object_list, {'model': models.Event}),
(r'^blog/entries/$', views.object_list, {'model': models.BlogEntry}),
)
# views.py
from django.shortcuts import render_to_response
def object_list(request, model):
obj_list = model.objects.all()
template_name = 'mysite/%s_list.html' % model.__name__.lower()
return render_to_response(template_name, {'object_list': obj_list})
就这样小小的改动,我们突然发现我们有了一个可复用的,模型无关的视图! 从现在开始,当我们需要一个视
图来显示一系列的对象时,我们可以简简单单的重用这一个 object_list视图,而无须另外写视图代码了。
我的博客其他文章列表
http://my.oschina.net/helu