Python(8)——Django之URL配置

1、URL分类:
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





你可能感兴趣的:(Python(8)——Django之URL配置)