Django中URLconf和include()的协同工作方法
捕获的参数如何和include()协同工作
一个被包含的URLconf接收任何来自parentURLconfs的被捕获的参数,比如:
#rooturls.py fromdjango.conf.urls.defaultsimport* urlpatterns=patterns('', (r'^(?P<username>\w+)/blog/',include('foo.urls.blog')), ) #foo/urls/blog.py fromdjango.conf.urls.defaultsimport* urlpatterns=patterns('', (r'^$','foo.views.blog_index'), (r'^archive/$','foo.views.blog_archive'), )
在这个例子中,被捕获的username变量将传递给被包含的URLconf,进而传递给那个URLconf中的每一个视图函数。
注意,这个被捕获的参数总是传递到被包含的URLconf中的每一行,不管那些行对应的视图是否需要这些参数。因此,这个技术只有在你确实需要那个被传递的参数的时候才显得有用。
额外的URLconf如何和include()协同工作
相似的,你可以传递额外的URLconf选项到include(),就像你可以通过字典传递额外的URLconf选项到普通的视图。当你这样做的时候,被包含URLconf的每一行都会收到那些额外的参数。
比如,下面的两个URLconf在功能上是相等的。
第一个:
#urls.py fromdjango.conf.urls.defaultsimport* urlpatterns=patterns('', (r'^blog/',include('inner'),{'blogid':3}), ) #inner.py fromdjango.conf.urls.defaultsimport* urlpatterns=patterns('', (r'^archive/$','mysite.views.archive'), (r'^about/$','mysite.views.about'), (r'^rss/$','mysite.views.rss'), )
第二个
#urls.py fromdjango.conf.urls.defaultsimport* urlpatterns=patterns('', (r'^blog/',include('inner')), ) #inner.py fromdjango.conf.urls.defaultsimport* urlpatterns=patterns('', (r'^archive/$','mysite.views.archive',{'blogid':3}), (r'^about/$','mysite.views.about',{'blogid':3}), (r'^rss/$','mysite.views.rss',{'blogid':3}), )
这个例子和前面关于被捕获的参数一样(在上一节就解释过这一点),额外的选项将总是被传递到被包含的URLconf中的每一行,不管那一行对应的视图是否确实作为有效参数接收这些选项,因此,这个技术只有在你确实需要那个被传递的额外参数的时候才显得有用。因为这个原因,这种技术仅当你确信在涉及到的接受到额外你给出的选项的每个URLconf时有用的才奏效。