URL的配置有很多种,这里列举一下
1.配置直到views的具体函数
不常用,不推荐,对于每个函数都要在开头写引用,极其麻烦
urlpatterns = patterns('', (r'^hello/$', hello), (r'^time/$', current_datetime), (r'^time/plus/(\d{1,2})/$', hours_ahead), )
2.用字符串表示函数的路径
常用,每个URL对应的函数写全路径,可以用字符的方式表示,
urlpatterns = patterns('', (r'^hello/$', 'mysite.views.hello' ), (r'^time/$', 'mysite.views.current_datetime' ), (r'^time/plus/(d{1,2})/$', 'mysite.views.hours_ahead' ), )
进阶写法,可以把公共部分写到开头中,如下, mysite.views已经被提前到第一个参数, 在下面的配置中变得很简洁
urlpatterns = patterns('mysite.views' , (r'^hello/$', 'hello' ), (r'^time/$', 'current_datetime' ), (r'^time/plus/(d{1,2})/$', 'hours_ahead' ), )
再进阶,联合多个不再一个views里面的函数
这种写法个人觉得不推荐, 完全可以独立出几个app写到各个APP中,更加清晰
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'), )
3.URL的通配符支持
简单的例子, 不写对应的名称,
urlpatterns = patterns('', (r'^articles/(\d{4})/$', views.year_archive), (r'^articles/(\d{4})/(\d{2})/$', views.month_archive), )对应函数
def year_archive(request,day,year):
指明参数名的例子如下,和上例中的区别在于,在定义函数的时候,参数名称要对得上
urlpatterns = patterns('', (r'^articles/(?P<year>\d{4})/$', views.year_archive), (r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/$', views.month_archive), )
4.通过URL给views传参数
这个常用于使用一个views对应多个url的情况, 可以通过在url中提前配置一些特异信息, 让view函数知道如何应对
这个例子本身已经说明问题了~
urlpatterns = patterns('', (r'^foo/$', views.foobar_view, {'template_name': 'template1.html'}), (r'^bar/$', views.foobar_view, {'template_name': 'template2.html'}), ) # views.py from django.shortcuts import render_to_response from mysite.models import MyModel def foobar_view(request, template_name="me"): m_list = MyModel.objects.filter(is_new=True) return render_to_response(template_name, {'m_list': m_list})
注意到template_name="me"这个是一个默认值的设置,假如在url中没有任何值传入, 这个默认参数就生效了
进阶:
格式化数字URL传参,比如可以用today替代一些数字
urlpatterns = patterns('', (r'^mydata/birthday/$', views.my_view, {'month': 'jan', 'day': '06'}), (r'^mydata/(?P<month>\w{3})/(?P<day>\d\d)/$', views.my_view), )
5.URL的包含,一般用在主要的url和二级app的包含中
urlpatterns = patterns('', (r'^(?P<username>\w+)/blog/', include('foo.urls.blog')), )