標籤:
使用Django開發網站時,如果不使用模板,那麼將會很不合理。因為我們所有的html代碼都需要被寫入程式碼到我們的Python代碼中。我們建立一個工程,然後再在建立一個應用程式,並在其中的views.py檔案中添加如下代碼:
1 #coding=UTF-8 2 from django.http.response import HttpResponse, Http404 3 import datetime 4 5 def hours_ahead(request,offset): 6 try: 7 offset = int(offset) 8 except ValueError: 9 raise Http404()10 11 dt = datetime.datetime.now() + datetime.timedelta(hours = offset) #datedelta()中參數必須是整型12 html = "<html><body>In %s hour(s),it will be %s.<body/><html/>"%(offset,dt)13 return HttpResponse(html)
從上面的代碼中就可以看出,我們的HTML代碼和我們的Python混合在一起了,這樣不僅影響開發速度,也不便於後期維護。下面我會詳細介紹django中的模板。模板的作用是要實現將HTML代碼和Python代碼分開。首先在我們應用程式下面建立一個templates檔案夾,之後我們的所有模板都會放在這個檔案夾下面,因為django1.6的setting.py檔案中沒有TEMPLATE_DIRS這個選項,取而代之的是它會預設去尋找template檔案夾下面的模板。我們在這個檔案夾下面建立一個html。這個html檔案中主要是放一些我們頁面不會變化或者很少變化的代碼,而那些經常變化的代碼我們使用{%block%}{%endblock%}進行申明,然後在子頁面中可以對這部分代碼進行覆蓋。base.html代碼如下:
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>{%block title%}{%endblock%}</title> 6 </head> 7 <body> 8 <h1>My helpful timestamp site</h1> 9 {%block content%}{%endblock%}10 {%block footer%}11 <hr>12 <p>Thanks for visiting my site</p>13 {%endblock%}14 </body>15 </html>
上面代碼中,我們使用模板標籤將html的title,content,以及footer進行了佔位。然後再建立一個current_datetime.html的頁面繼承我們的base.html頁面,然後對其中的title,content部分進行覆蓋,footer部分保留父頁面base.html中的代碼。代碼如下:
1 {%extends "base.html"%} <!--使用extends繼承base.html頁面。必須放在第一行-->2 3 {%block title%}The current time{%endblock%}<!--定義title代碼塊中的內容-->4 5 {%block content%} <!--定義content代碼塊中的內容-->6 <P>It is now {{current_date}}.</p>7 {%endblock%}
這樣使用之後,我們訪問current_datetime.html頁面的時候整體架構是base.html中所定義的,而局部效果回事我們current_datetime.html中所定義的。對於一個網站而言,我們可以定義儘可能多的{%block%},這樣我們子頁面繼承的時候會有較好的擴充性。下面是視圖views.py中所定義的函數代碼:
1 from datetime import datetime 2 from django.shortcuts import render_to_response 3 # from django.template.loader import get_template 4 # from django.template.context import Context 5 # from django.http.response import HttpResponse 6 7 # Create your views here. 8 # def current_time(request): 9 # now = datetime.now()10 # t = get_template(‘current_time.html‘)11 # html = t.render(Context({‘current_date‘:now}))12 # 13 # return HttpResponse(html)14 15 def current_time(request):16 now = datetime.now()17 return render_to_response(‘current_datetime.html‘,{‘current_date‘:now})
上面的函數返回當前的時間,注釋部分和沒注釋的代碼效果是一樣的。值得注意的是使用render_to_response函數時,其第一個參數必須是要使用模板的名稱。第二個參數是可選的,如果你要給定這個參數,那麼這個參數必須是為該模板建立Context時所使用的字典。如果不給定,函數將使用一個空字典。下面是應用程式中urls.py的代碼:
1 from django.conf.urls import patterns, url2 from Second import views3 4 urlpatterns = patterns(‘‘,5 url(r‘^time/‘, views.current_time),6 )
urls.py是將我們視圖views.py中的代碼和我們之後訪問頁面在地址欄中所輸入的地址進行綁定。url()中的第一個參數是一個Regex,第二個參數是我們要綁定的函數代碼。配置好我們應用程式的urls.py之後,我們還需要在我們項目的urls.py中進行配置,具體如下:
1 from django.conf.urls import patterns, include, url2 3 urlpatterns = patterns(‘‘,4 url(r‘^Second/‘,include(‘Second.urls‘))5 )
在這裡我們使用include將我們應用程式Second中的urls引入。並指定我們要訪問頁面的Regex。結合兩個urls.py中Regex所描述的url,我們之後在訪問頁面的時候,路徑應該是http://localhost:8000/Second/time/。這裡連接埠8000是預設的。我們可以選擇我們想要的連接埠號碼,但是前提是那個連接埠號碼沒有被其它應用程式佔用。最有我們在項目的setting.py將我們的應用程式進行註冊。開啟項目的setting.py,在INSTALLED_APPS中將我們應用程式的名字加入。如下:
然後我們啟動服務,並訪問localhost:8000/Second/time,可以看到下面的效果。
Python筆記(五)--Django中使用模板