接着上節的繼續學習,現在要顯示所有主題的頁面
有了高效的網頁創建方法,就能專注於另外兩個網頁了:顯示全部主題的網頁以及顯示特定主題中條目的網頁。所有主題頁面顯示用戶創建的所有主題,它是第一個需要使用數據的網頁。
一 顯示所有主題的頁面
1 URL模式
#定義learning_logs的URL模式 from django.conf.urls import url from . import views app_name='learning_logs' urlpatterns=[ #主頁 url(r'^$',views.index,name='index'), #顯示所有主題, url(r'^topics/$',views.topics,name='topics') ]
2 視圖
函數topics()需要從數據庫中獲取一些數據,並將其發送給模板。我們需要在views.py中添加的代碼如下:
from django.shortcuts import render from .models import Topic # Create your views here. def index(request): '''學習筆記的主頁''' return render(request,'learning_logs/index.html') def topics(request): topics = Topic.objects.order_by('date_added') context = {'topics': topics} return render(request, 'learning_logs/topics.html', context)
3 模板
顯示所有主題的頁面的模板接受字典context,以便能夠使用topics()提供的數據。請創建一個文件,將其命名為topics.html,並存儲到index.html所在的目錄中。下面演示了如何在這個模板中顯示主題:
{% extends "learning_logs/base.html" %} {% block content %} <p>Topics</p> <ul> {% for topic in topics %} <li>{{ topic }}</li> {% empty %} <li>No topics have been added yet.</li> {% endfor %} </ul> {% endblock content %}
打開這個link:http://127.0.0.1:8000/topics/
二 顯示特定主題的頁面
接下來,我們需要創建一個專注於特定主題的頁面——顯示該主題的名稱及該主題的所有條目。同樣,我們將定義一個新的URL模式,編寫一個視圖並創建一個模板。我們還將修改顯示所有主題的網頁,讓每個項目列表項都是一個鏈接,單擊它將顯示相應主題的所有條目。
1 URL模式
顯示特定主題的頁面的URL模式與前面的所有URL模式都稍有不同,因為它將使用主題的id屬性來指出請求的是哪個主題。例如,如果用戶要查看主題Chess(其id為1)的詳細頁面,URL將為http://localhost:8000/topics/1/。下面是與這個URL匹配的模式,它包含在learning_logs/urls.py中:
#定義learning_logs的URL模式 from django.conf.urls import url from . import views app_name='learning_logs' urlpatterns=[ #主頁 url(r'^$',views.index,name='index'), #顯示所有主題, url(r'^topics/$',views.topics,name='topics'), #特定主題的詳細頁面 url(r'^topics/(?P<topic_id>\d+)',views.topics,name='topic') ]
發現URL與這個模式匹配時,Django將調用視圖函數topic(),並將存儲在topic_id中的值作為實參傳遞給它。在這個函數中,我們將使用topic_id的值來獲取相應的主題。
2 視圖
函數topic()需要從數據庫中獲取指定的主題以及與之相關聯的所有條目,如下所示:
def topic(request,topic_id): '''顯示單個主題以及所有的條目''' topic=Topic.objects.get(id=topic_id) entries=topic.entry_set.order_by('-date_added') context = {'topic':topic,'entries':entries} return render(request, 'learning_logs/topic.html', context)
3 模板
這個模板需要顯示主題的名稱和條目的內容;如果當前主題不包含任何條目,我們還需向用戶指出這一點:
{% extends "learning_logs/base.html" %} {% block content %} <p>Topic: {{ topic }}</p> <p>Entries:</p> <ul> {% for entry in entries %} <li> <p>{{ entry.date_added|date:'M d, Y H:i' }}</p> <p>{{ entry.text|linebreaks }}</p> </li> {% empty %} <li> There are no entries for this topic yet. </li> {% endfor %} </ul> {% endblock content %}
結果如下圖:
三 總結
在本章中,我們首先學習了如何使用Django框架來創建Web應用程序。制定了簡要的項目規范,在虛擬環境中安裝了Django,創建了一個項目,並核實該項目已正確地創建。學習了如何創建應用程序,以及如何定義表示應用程序數據的模型。學習了數據庫,以及在修改模型后,Django可為遷移數據庫提供什么樣的幫助。學習了如何創建可訪問管理網站的超級用戶,並使用管理網站輸入了一些初始數據。還探索了Django shell,它讓能夠在終端會話中處理項目的數據。學習了如何定義URL、創建視圖函數以及編寫為網站創建網頁的模板。最后,使用了模板繼承,它可簡化各個模板的結構,並使得修改網站更容易。
四 展望
在接下來的學習中,我們將創建對用戶友好而直觀的網頁,讓用戶無需通過管理網站就能添加新的主題和條目,以及編輯既有的條目。我們還將添加一個用戶注冊系統,讓用戶能夠創建賬戶和自己的學習筆記。讓任意數量的用戶都能與之交互,是Web應用程序的核心所在。