django 1.4.5 documentation
The view layer -->The basics
一、
patterns語法格式:
一、
patterns語法格式:
patterns = pattern('prefix', //prefix一般爲空 url() )
url語法格式:
patterns = pattern('prefix', url(regular expression, view function [, optional dictionary[, name]]) )
optional dictionary是字典形式參數
optional name是named url pattern
二、語法示例:
optional name是named url pattern
二、語法示例:
urlpatterns = pattern('', (r'^articles/2003/$', 'news.views.special_case_2003'), (r'^articles/(\d{4})/$', 'news.views.year_archive'), (r'^articles/(\d{4})/(\d{2})/$', 'news.views.month_archive'), (r'^articles/(\d{4)/(\d{2})/(\d+)/$', 'news.views.article_detail'), )
1、括號內的參數在傳遞給view視圖函數時,都是按位置進行傳遞
2、url請求/articles/2005/03/ 會被第三條記錄匹配,Django會調用news.views.month_archive(request, '2005', '03')函數來處理URL請求
3、第一條和第二條記錄都能匹配url請求/articles/2003/ , 但是django會使用第一條記錄來匹配,因爲urlpattern是按順序進行匹配,只要匹配到就忽略後面的記錄。這種形式不是很好,後面會介紹在views視圖函數中使用默認參數來處理這種特殊情況
三、命名組:
命名組語法格式: (?P<name>pattern)
其中,name是分組的名稱,pattern是用於匹配的正則表達式
urls.py:
2、url請求/articles/2005/03/ 會被第三條記錄匹配,Django會調用news.views.month_archive(request, '2005', '03')函數來處理URL請求
3、第一條和第二條記錄都能匹配url請求/articles/2003/ , 但是django會使用第一條記錄來匹配,因爲urlpattern是按順序進行匹配,只要匹配到就忽略後面的記錄。這種形式不是很好,後面會介紹在views視圖函數中使用默認參數來處理這種特殊情況
三、命名組:
命名組語法格式: (?P<name>pattern)
其中,name是分組的名稱,pattern是用於匹配的正則表達式
urls.py:
from django.conf.urls import patterns, url, include urlpatterns = urlpattern('', (r'^articles/2003/$', 'news.views.special_case_2003'), (r'^articles/(?P<year>\d{4})/$', 'news.views.year_archive'), (r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/$', 'news.views.month_archive'), (r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})/$', 'news.views.article_detail'), )
1、django會調用news.views.month_archive(request, year='2005', month='03')來處理URL請求:/articles/2005/03/ ,這種形式比按位置傳遞可讀性更強一些,也不容易出錯
四、urlpattern匹配URL請求時捕獲的參數,都是以python字符串的形式傳遞給view視圖函數,不管參數是以什麼形式被捕獲的:
四、urlpattern匹配URL請求時捕獲的參數,都是以python字符串的形式傳遞給view視圖函數,不管參數是以什麼形式被捕獲的:
(r'^articles/(?P<year>\d{4})/$', 'news.views.year_archive'),
儘管urlpattern在匹配時,\d{4}只匹配數字,但是當它把捕獲到的年份數字傳遞給view視圖函數時,是以字符串形式傳遞的。
五、爲視圖函數指定默認參數:
#URLconf urlpatterns = pattern('', (r'^blog/$', 'blog.views.page'), (r'^blog/page(?P<num>\d+)/$', 'blog.views.page'), ) # View (in blog/views.py) def page(request, num="1"): #Output the appropriate page of blog entries, according to num.
上述示例,所有的請求都使用blog.views.page視圖函數來處理URL請求;但當URL請求僅包括 /blog/ 時(特殊情況),被第一條記錄匹配,視圖函數page在處理該請求時,自動使用默認參數num的值1,具體形式由函數體定義。
六、簡化urlpattern書寫:
1、The view prefix:
六、簡化urlpattern書寫:
1、The view prefix:
urlpatterns = patterns('news.views', //把前綴news.views添加到這裏,避免在每一條記錄中重複書寫 (r'^articles/(\d{4})/$', 'year_archive'), (r'^articles/(\d{4})/(\d{2})/$', 'month_archive'), (r'^articles/(\d{4})/(\d{2})/(\d+)/$', 'article_detail'), )
2、Including other URLconfs:
urlpatterns = patterns('', # ... snip ... (r'^comments/', include('django.contrib.comments.urls')), (r'^community/', include('django_website.aggregator.urls')), (r'^contact/', include('django_website.contact.urls')), (r'^r/', include('django.conf.urls.shortcut')), # ... snip ... )
使用include時,正則表達式不能使用$,因爲在django執行時include時,是把include的url追加到後面
另一種形式:
另一種形式:
from django.conf.urls import patterns, url, include extra_patterns = patterns('', url(r'^reports/(?P<id>\d+)/$', 'credit.views.report', name='credit-reports'), url(r'^charge/$', 'credit.views.charge', name='credit-charge'), ) urlpatterns = patterns('', url(r'^$', 'apps.main.views.homepage', name='site-homepage'), (r'^help/', include('apps.help.urls')), (r'^credit/', include(extra_patterns)), )
七、傳遞額外參數到視圖函數:
urlpatterns = patterns('blog.views', (r'^blog/(?P<year>\d{4})/$', 'year_archive', {'foo': 'bar'}), )
1、額外參數都是字典形式
2、如果字典參數的key與命名組名稱重名,則參數在傳遞給view視圖函數時,字典參數會覆蓋urlpattern捕獲的參數。如:
2、如果字典參數的key與命名組名稱重名,則參數在傳遞給view視圖函數時,字典參數會覆蓋urlpattern捕獲的參數。如:
urlpatterns = patterns('blog.views', (r'^blog/(?P<year>\d{4})/$', 'year_archive', {'year': '000'}), )
view視圖函數在處理URL請求/blog/2013/,使用的參數不是2013,而是000,儘管urlpattern捕獲的參數是2013。
八、傳遞額外參數到include():
# main.py urlpatterns = patterns('', (r'^blog/', include('inner'), {'blogid': 3}), ) # inner.py urlpatterns = patterns('', (r'^archive/$', 'mysite.views.archive'), (r'^about/$', 'mysite.views.about'), )
相當於:
# main.py urlpatterns = patterns('', (r'^blog/', include('inner')), ) # inner.py urlpatterns = patterns('', (r'^archive/$', 'mysite.views.archive', {'blogid': 3}), (r'^about/$', 'mysite.views.about', {'blogid': 3}), )
1、額外參數都是字典形式
2、傳遞給include()的額外參數,將傳遞到include裏的每一條記錄,不管該處理該記錄的視圖函數是否能正確接受相應的參數
九、Naming URL patterns:
2、傳遞給include()的額外參數,將傳遞到include裏的每一條記錄,不管該處理該記錄的視圖函數是否能正確接受相應的參數
九、Naming URL patterns:
urlpatterns = patterns('', url(r'^archive/(\d{4})/$', archive, name="full-archive"), url(r'^archive-summary/(\d{4})/$', archive, {'summary': True}, "arch-summary"), )
使用:
{% url arch-summary 1945 %}
{% url full-archive 2007 %}
當多條記錄都使用同一個視圖函數處理時,使用named url來區分不同的記錄
{% url arch-summary 1945 %}
{% url full-archive 2007 %}
當多條記錄都使用同一個視圖函數處理時,使用named url來區分不同的記錄