1:直接导入视图函数
1 from django.conf.urls.defaults import * 2 from mysite.views import hello 3 urlpatterns = patterns('', 4 (r'^hello/$', hello), 5 (r'^time/$', time), 6 )
2:导入包函模块名和函数的客串,而不是函数本身
1 from django.conf.urls.defaults import * 2 from mysite import views 3 urlpatterns = patterns('', 4 (r'^hello/$', 'views.hello'), 5 (r'^time/$', 'views.time'), 6 )
3:不用导入任何视图内容,写清楚字符串描述
1 from django.conf.urls.defaults import * 2 urlpatterns = patterns('', 3 (r'^hello/$', 'mysite.views.hello'), 4 (r'^time/$', 'mysite.views.time'), 5 )
4:提取一个公共视图前缀
1 from django.conf.urls.defaults import * 2 urlpatterns = patterns('mysite.views', 3 (r'^hello/$', 'hello'), 4 (r'^time/$', 'time'), 5 )
5:partterns()返回对对象的相加
1 旧: 2 from django.conf.urls.defaults import * 3 urlpatterns = patterns('mysite.view', 4 (r'^hello/$', 'hello'), 5 (r'^time/$', 'time'), 6 (r'^other/$', 'mysite.others.other'), 7 ) 8 新: 9 from django.conf.urls.defaults import * 10 urlpatterns = patterns('mysite.view', 11 (r'^hello/$', 'hello'), 12 (r'^time/$', 'time'), 13 ) 14 urlpatterns += patterns('mysite.others', 15 (r'^other/$', 'other'), 16 )
6:带命名组的URL
到目前为止,在所有URLconf例子中,我们使用的很简单,即“无命名”正则表达式组,在我们想要捕获的URL部分加上小括号,django会将捕获的文本作为位置参数传递给视图函数。在更高级的用法中,还可以使用“命名”正则表达式组来捕获URL,并且将其作为“关键字”参数 传给视图
下面是一个使用无名组的URLconf的例子:
1 from django.conf.urls.defaults import * 2 from mysite import views 3 urlpatterns = patterns('', 4 (r'^arcticles/(\d{4})/$',views.year_archive), 5 (r'^arcticles/(\d{4})/(\d{2})/$', view.moth_archive), 6 )
下面是相同的URLconf,使用命名组进行了重写:
1 from django.conf.urls.defaults import * 2 from mysite import views 3 urlpatterns = patterns('', 4 (r'^arcticles/(?P<year>\d{4})/$', veiws.year_archive), 5 (r'^arcticles/(?P<year>\d{4})/(?P<month>\d{2})/$', veiws.month_archive), 6 )
如果不带命名组,请求/arcticle/2006/03/将会等于这样的函数调用:
month_archive(request, '2006', '03')
而带命名组,同样的请求就是这样的函数调用:
month_archive(request, year='2006', month='03')
从中可以看出,使用命名组可以让你的URLconf更加清晰,减少参数次序可能搞混潜在的Bug, 还可以让你的定义中对参数重新排序。
7:视图冗余:
1 # urls.py 2 3 from django.conf.urls.defaults import * 4 from mysite import views 5 6 urlpatterns = patterns('', 7 (r'^(foo)/$', views.foobar_view), 8 (r'^(bar)/$', views.foobar_view), 9 ) 10 11 # views.py 12 13 from django.shortcuts import render_to_response 14 from mysite.models import MyModel 15 16 def foobar_view(request, url): 17 m_list = MyModel.objects.filter(is_new=True) 18 if url == 'foo': 19 template_name = 'template1.html' 20 elif url == 'bar': 21 template_name = 'template2.html' 22 return render_to_response(template_name, {'m_list': m_list})
利用上面的方法可以减少视图冗余
8:为url里传入固定的参数:
1 # urls.py 2 3 from django.conf.urls.defaults import * 4 from mysite import views 5 6 urlpatterns = patterns('', 7 (r'^foo/$', views.foobar_view, {'template_name': 'template1.html'}), 8 (r'^bar/$', views.foobar_view, {'template_name': 'template2.html'}), 9 ) 10 11 # views.py 12 13 from django.shortcuts import render_to_response 14 from mysite.models import MyModel 15 16 def foobar_view(request, template_name): 17 m_list = MyModel.objects.filter(is_new=True) 18 return render_to_response(template_name, {'m_list': m_list})
9:include导入:
1 from django.conf.urls.defaults import * 2 urlpatterns = patterns('', 3 (r'^weblog/', include('mysite.blog.urls')), 4 (r'^photos/', include('mysite.photos.urls')), 5 (r'^about/$', 'mysite.views.about'), 6 )