Django系列教程:三、動態視圖和動態Url


注明:python版本為3.3.1、Django版本為1.5.1,操作系統為Windows7,其他版本有一些不同的地方讀者可以自行探討。

前一章我們簡略的講解了下Django的視圖和Url的配置,那么這一章我們就通過一個簡單的例子來講解下動態視圖和動態Url。

照例使用python manage.py runserver 命令啟動web服務。下面我們將用datetime模塊顯示和計算時鍾。

打開上一章建立的view.py文件,在原有代碼后面加入以下代碼:

import datetime
def current_datetime(request):
    now=datetime.datetime.now()
    html="<html><body>It's now %s.</body></html>" %now
    return HttpResponse(html)

上面代碼的意思如果大家稍微知道點python知識就應該明白,%now其實就是給%s傳遞了一個值,而已這里就不做過多解釋。

再打開urls.py文件建立相應的url配置,url配置文件代碼如下。

from django.conf.urls import patterns,include,url
urlpatterns = patterns('',
    # Examples:
     url(r'^hello/$','firstsite.view.hello',name='hello'),
     url(r'^time/$','firstsite.view.current_datetime',name='current_datetime'),
)

這里看到代碼只是增加了倒數第二行一行,而且還刪除了from firstsite.view import hello這一行(這是我后來才注意到到的在url中其實已經有導入的意思了,這行代碼顯得有點多余,並不影響代碼的執行,也能輸出helloworld,這里做個糾正。另外name的名字也不一定要是current_datetime,只是為了好記所以這樣寫。
打開瀏覽器輸入:http://127.0.0.1:8000/time/ 顯示出當前的時間。如下圖:

---------------------------------------------------------------------

每次刷新頁面都可以看到數字有變化哦。當然現在這只是靜態的變化,如果我想得到一個小時候的時間該怎么辦呢?下面我們就解決這個問題,也就是動態Url。

我們要實現的輸入:http://127.0.0.1:8000/time/plus/1/ 則顯示比當前時間晚1個小時的時間,輸入:http://127.0.0.1:8000/time/plus/2/ 則顯示比當前時間晚2個小時的時間,當然為了簡便點我們將規定最大值為99,也就是最大顯示99個小時以后的時間。

一般來說新手看到這個問題可能會直接在urls.py文件中寫代碼,比如下面這個:

from django.conf.urls import patterns,include,url
urlpatterns = patterns('',
    # Examples:
     url(r'^hello/$','firstsite.view.hello',name='hello'), 
     url(r'^time/$','firstsite.view.current_datetime',name='current_datetime'),
     url(r'^time/plus/1/$','firstsite.view.current_datetime_addone',name='current_datetime_addone'),
     url(r'^time/plus/2/$','firstsite.view.current_datetime_addtwo',name='current_datetime_addtwo’),
     url(r'^time/plus/3/$','firstsite.view.current_datetime_addthree',name='current_datetime_addthree'),
)

上面這些代碼結合在view.py里面添加的current_datetime_addone、current_datetime_addtwo、current_datetime_addthree三個函數雖然可以顯示:

http://127.0.0.1:8000/time/plus/1/

http://127.0.0.1:8000/time/plus/2/

http://127.0.0.1:8000/time/plus/3/

這三個頁面,但要顯示4小時后則又要添加函數和url配置,顯得好不麻煩,所以下面有一個更好的方法。

更改view.py代碼如下:

def hours_add(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)

其中的try和except是因為從url獲得的參數可能會是數字以外的字符,offset可以隨便為一個名稱,接受url傳遞過來參數,try后面的offset=int(offset)只是因為timedelta()函數里面的幾個參數要求的都要是整數,所以必須轉換,如果傳遞過來的參數不是整數,比如:http://127.0.0.1/time/plus/ab/ 傳遞過來的就是ab,這時沒法將ab轉換成整形,便會引發Http404()這個函數,至於這個函數怎么顯示,大家可以百度之哦。

再更改urls.py文件代碼如下:

from django.conf.urls import patterns,include,url
urlpatterns = patterns('',
    # Examples:
     url(r'^hello/$','firstsite.view.hello',name='hello'),
     url(r'^time/$','firstsite.view.current_datetime',name='current_datetime'),
     url(r'^time/plus/(\d{1,2})/$', 'firstsite.view.hours_add',name='time-plus'),
     url(r'^.*$', 'firstsite.view.error', name='error'),
)

倒數第二行其實是一個404的頁面,只要在view.py里面再定義一個error函數就可以了,可以模仿hello。
倒數第三行的(\d{1,2})這個正則表達式的意思則是輸入一個0-99(包括0和99)之間的數字。

好了現在輸入:http://127.0.0.1:8000/time/plus/2/ 試試看是不是得到了下面的結果。

---------------------------------------------------------------------

 更改數字試試看是不是有變化哦。

最后我們回到view.py文件的hours_add()函數,目前里面只傳遞了兩個參數,那么我們是不是可以傳遞第三個參數呢?想到這,聰明的你應該知道怎么做了吧,這個問題就留給大家了。

另外本教程參考了DjangoBook2里面的很多內容,我也是每天學完一章然后隔一天就寫個教程復習下,所以很多例子可能會很相似,大家也可以直接去看這本書,在我博客主頁的連接上就有它的翻譯版本,大家也可以網上下載,不過一定要注意版本哦。

這一章暫時就到這把,下周一就要交畢業設計了,論文才寫了兩章,要加油了。下一章我們講講Django的模板吧。

本人既是python的初學者也是Django的初學者,寫這一系列教程的目的就是為了加深自己的理解,希望大家多多包涵和指教,有什么問題請留言,謝謝。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM