使用Django開發網站時,若是不使用模板,那麼將會很不合理。由於咱們全部的html代碼都須要被硬編碼到咱們的Python代碼中。咱們新建一個工程,而後再在新建一個應用程序,並在其中的views.py文件中添加以下代碼:html
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中的代碼。代碼以下:django
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, url 2 from Second import views 3 4 urlpatterns = patterns('', 5 url(r'^time/', views.current_time), 6 )
urls.py是將咱們視圖views.py中的代碼和咱們以後訪問頁面在地址欄中所輸入的地址進行綁定。url()中的第一個參數是一個正則表達式,第二個參數是咱們要綁定的函數代碼。配置好咱們應用程序的urls.py以後,咱們還須要在咱們項目的urls.py中進行配置,具體以下:網站
1 from django.conf.urls import patterns, include, url 2 3 urlpatterns = patterns('', 4 url(r'^Second/',include('Second.urls')) 5 )
在這裏咱們使用include將咱們應用程序Second中的urls引入。並指定咱們要訪問頁面的正則表達式。結合兩個urls.py中正則表達式所描述的url,咱們以後在訪問頁面的時候,路徑應該是http://localhost:8000/Second/time/。這裏端口8000是默認的。咱們能夠選擇咱們想要的端口號,可是前提是那個端口號沒有被其它應用程序佔用。最有咱們在項目的setting.py將咱們的應用程序進行註冊。打開項目的setting.py,在INSTALLED_APPS中將咱們應用程序的名字加入。以下:編碼
而後咱們啓動服務,並訪問localhost:8000/Second/time,能夠看到下面的效果。url