接着上節的繼續學習,使用Django創建網頁的過程通常分三個階段:定義URL、編寫視圖和編寫模板。首先,你必須定義URL模式,每個URL都被映射到特定的視圖——視圖函數獲取並處理網頁所需的數據。視圖函數通常調用一個模板,后者生成瀏覽器能夠理解的網頁。為明白其中的工作原理,我們來創建學習筆記的主頁。我們將定義該主頁的URL、編寫其視圖函數並創建一個簡單的模板。
一 創建網頁:學習筆記主頁
1 映射URL
用戶通過在瀏覽器中輸入URL以及單擊鏈接來請求網頁,因此我們需要確定項目需要哪些URL 。主頁的URL 最重要, 它是用戶用來訪問項目的基礎URL 。當前, 基礎URL(http://localhost:8000/)返回默認的Django網站,讓我們知道正確地建立了項目。我們將修改這一點,將這個基礎URL映射到“學習筆記”的主頁。打開項目主文件夾learning_log中的文件urls.py,你將看到如下代碼:
from django.conf.urls import include,url from django.contrib import admin from django.urls import path urlpatterns = [ path('admin/', admin.site.urls), url(r'', include('learning_logs.urls', namespace='learning_logs')), ]
默認的urls.py包含在文件夾learning_log中,現在我們需要在文件夾learning_logs中創建另一個urls.py文件:
#定義learning_logs的URL模式 from django.conf.urls import url form . import views urlpatterns=[ #主頁 url(r'^$',views.index,name='index') ]
實際的URL模式是一個對函數url()的調用,這個函數接受三個實參。第一個是一個正則表達式。Django在urlpatterns中查找與請求的URL字符串匹配的正則表達式,因此正則表達式定義了Django可查找的模式。
url()的第二個實參指定了要調用的視圖函數。請求的URL與前述正則表達式匹配時,Django將調用views.index(這個視圖函數將在下一節編寫)。第三個實參將這個URL模式的名稱指定為index,讓我們能夠在代碼的其他地方引用它。每當需要提供到這個主頁的鏈接時,我們都將使用這個名稱,而不編寫URL。
2 編寫視圖
視圖函數接受請求中的信息,准備好生成網頁所需的數據,再將這些數據發送給瀏覽器——這通常是使用定義了網頁是什么樣的模板實現的。
learning_logs中的文件views.py是你執行命令python manage.py startapp時自動生成的,當前其內容如下:
from django.shortcuts import render
當前,這個文件只導入了函數render(),它根據視圖提供的數據渲染響應。下面的代碼演示了該如何為主頁編寫視圖:
from django.shortcuts import render # Create your views here. def index(request): '''學習筆記的主頁''' return render(request,'learning_logs/index.html')
3 編寫模板
模板定義了網頁的結構。模板指定了網頁是什么樣的,而每當網頁被請求時,Django將填入相關的數據。模板讓你能夠訪問視圖提供的任何數據。我們的主頁視圖沒有提供任何數據,因此相應的模板非常簡單。
<p>Learning Log</p> <p>Learning Log helps you keep track of your learning, for any topic you're learning about.</p>
如果你請求這個項目的基礎URL——http://localhost:8000/,將看到剛才創建的網頁,而不是默認的Django網頁。Django接受請求的URL,發現該URL與模式r'^$'匹配,因此調用函數views.index(),這將使用index.html包含的模板來渲染網頁,結果如圖:
提示:上面有一個問題,就是報一個錯誤:
path(r'', include('learning_logs.urls', namespace='learning_logs') ), File "D:\study\python\code\learning_log\11_env\lib\site-packages\django\urls\conf.py", line 39, in include 'Specifying a namespace in include() without providing an app_name ' django.core.exceptions.ImproperlyConfigured: Specifying a namespace in include() without providing an app_name is not supported. Set the app_name attribute in the included module, or pass a 2-tuple containing the list of patterns and app_name instead.
一定要在D:\study\python\code\learning_log\learning_log下面的urls.py改成如下:
from django.conf.urls import include,url from django.contrib import admin from django.urls import path urlpatterns = [ path('admin/', admin.site.urls), path(r'',include('learning_logs.urls', namespace='learning_logs')), ]
並在D:\study\python\code\learning_log\learning_logs下面的urls.py加上:app_name='learning_logs'如下:
#定義learning_logs的URL模式 from django.conf.urls import url from . import views app_name='learning_logs' urlpatterns=[ #主頁 url(r'^$',views.index,name='index') ]
二 創建其他網頁
制定創建網頁的流程后,可以開始擴充“學習筆記”項目了。我們將創建兩個顯示數據的網頁,其中一個列出所有的主題,另一個顯示特定主題的所有條目。對於每個網頁,我們都將指定URL模式,編寫一個視圖函數,並編寫一個模板。但這樣做之前,我們先創建一個父模板,項目中的其他模板都將繼承它。
1 模板繼承
父模板:
我們首先來創建一個名為base.html的模板,並將其存儲在index.html所在的目錄中。這個文件包含所有頁面都有的元素;其他的模板都繼承base.html。當前,所有頁面都包含的元素只有頂端的標題。我們將在每個頁面中包含這個模板,因此我們將這個標題設置為到主頁的鏈接:
<p> <a href="{% url 'learning_logs:index' %}">Learning Log</a> </p> {% block content %}{% endblock content %}
2 子模板
現在需要重新編寫index.html,使其繼承base.html,如下所示:
{% extends "learning_logs/base.html" %} {% block content %} <p>Learning Log helps you keep track of your learning, for any topic you're learning about.</p> {% endblock content %}
今天有事就先寫到這里吧,明天繼續學習!