基礎
django.cof.url.defaults
django.cof.url.defaults.patterns()
urlpatterns = patterns('',
# Example:
# (r'^mysite/', include('mysite.foo.urls')),
# Uncomment the admin/doc line below and add 'django.contrib.admindocs'
# to INSTALLED_APPS to enable admin documentation:
# (r'^admin/doc/', include('django.contrib.admindocs.urls')),
# Uncomment the next line to enable the admin:
# (r'^admin/', include(admin.site.urls)),
)
在這個函數中添加元組映射:正則表達式->視圖函數
在正則表達式中,’^admin/’將會和以admin爲開頭的url匹配,如/admin/user/
‘admin/$’將會和以admin爲結尾的url匹配,如/01/lal/admin/
爲根目錄實現視圖:只需要添加正則表達式‘^$’對應的視圖函數就可以進行根目錄的匹配
django.cof.url.defaults.include()
include(arg, namespace=None, app_name=None):
arg是url.py的位置字符串,指定的該url文件位置可以在所在文件配置patterns,實現鬆散耦合。
namespace給url定義命名空間
Django處理視圖
當運行python manage.py runserver時,腳本將在於manage.py的同目錄下尋找setting.py文件,以尋找配置信息:
Django處理視圖的過程
ROOT_URLCONF這個配置最爲重要,它將作爲URLconf告訴Django在這個站點中那些Python的模塊將被用到
ROOT_URLCONF = 'mysite.urls'
這個配置指向mysite/url.py文件,這是視圖配置的文件
ROOT_URLCONF配置URLconf,並且在URLpatterns中進行匹配url所映射的view函數並調用,且把HttpRequest對象作爲第一個參數傳入函數中。
視圖函數返回一個HttpResponse
Django轉換HttpResponse爲一個適合的HTTP response, 以Web page顯示出來
view函數的傳參
默認情況下,view的第一個參數是HttpRequest對象。但是對於URLpatterns中url正則表達式的強大應用,如果匹配到了不確定性的內容,就需要我們向view中傳參進行處理。如:
from django.conf.urls.defaults import *
from mysite.views import hello, current_datetime, hours_ahead
urlpatterns = patterns('',
(r'^hello/$', hello),
(r'^time/$', current_datetime),
(r'^time/plus/(\d{1,2})/$', hours_ahead),
)
對於(\d{1,2})的匹配,可能會有1-2位的整數出現,對於這種不確定的情況,我們想要對不同的值獲取不同的結果,當然要在視圖(view)中設置參數傳入。
from django.http import Http404, HttpResponse
import datetime
def hours_ahead(request, offset):
try:
offset = int(offset)
except ValueError:
raise Http404()
dt = datetime.datetime.now() + datetime.timedelta(hours=offset)
html = "<html><body>In %s hour(s), it will be %s.</body></html>" % (offset, dt)
return HttpResponse(html)
offset 是從匹配的URL裏提取出來的。 例如:如果請求URL是/time/plus/3/,那麼offset將會是3;如果請求URL是/time/plus/21/,那麼offset將會是21。請注意:捕獲值永遠都是字符串(string)類型,而不會是整數(integer)類型,即使這個字符串全由數字構成(如:“21”)。
offset的位置很重要,它一定是view函數的第二個參數
其中有一個非常重要也是老練的做法,就是傳參進來之後,先要將參數進行類型轉換(類型設定),比如offset需要int()一下,否則默認是str類型的
還有一個地方,就是如果出現異常拋出了Http404
高級
URLconf
使用命名組
urlpatterns = patterns('',
(r'^articles/(?P<year>\d{4})/$', views.year_archive),
(r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/$',
views.month_archive),
)
修改前代碼
urlpatterns = patterns('',
(r'^articles/(\d{4})/$', views.year_archiv),
(r'^articles/(\d{4})/(\d{2})/$',views.month_archive),
)
那修改後調用函數:
month_archive(request, year='2006', month='03')
當然這只是一種做法,它使得代碼變得可讀性更高,但是它在某些人嚴重就出現了冗餘代碼
傳遞額外的參數到視圖函數中
URLconf裏面的每一個模式都可以包含第三個數據: 一個關
鍵字參數的字典:
urlpatterns = patterns('',
(r'^foo/$', views.foobar_view, {'template_name': 'template1.html'}),
(r'^bar/$', views.foobar_view, {'template_name': 'template2.html'}),
)
而在views.py中
def foobar_view(request, template_name):
m_list = MyModel.objects.filter(is_new=True)
return render_to_response(template_name, {'m_list': m_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})
使用 model.__name__.lower() 來決定模板的名字。 每個Python 的類都有一個 __name__ 屬性返
回類名。