django_url視圖

基礎


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__ 屬性返
回類名。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章