改寫視圖函數
上一章我們感受了視圖的工作流程。
**爲了讓視圖真正發揮作用,**改寫article/views.py
中的article_list
視圖函數:
article/views.py
from django.shortcuts import render
# 導入數據模型ArticlePost
from .models import ArticlePost
def article_list(request):
# 取出所有博客文章
articles = ArticlePost.objects.all()
# 需要傳遞給模板(templates)的對象
context = { 'articles': articles }
# render函數:載入模板,並返回context對象
return render(request, 'article/list.html', context)
代碼同樣很直白,分析如下:
.models
表示從當前文件夾的models.py
文件中導入ArticlePost
數據類ArticlePost.objects.all()
從ArticlePost
數據類獲得所有的對象(即博客文章),並傳遞給articles
變量context
定義了需要傳遞給模板的對象,即articles
- 最後返回了
render
函數:- 第一個變量是固定的
request
對象,照着寫就可以 - 第二個變量定義了模板文件的位置、名稱,即
article/list.html
- 第三個變量定義了需要傳入模板文件的對象,即
context
- 第一個變量是固定的
視圖函數這樣就寫好了。
編寫模板(template)
在前面的視圖中我們定義了模板的位置在article/list.html
,因此在根目錄下新建templates
文件夾,再新建article
文件夾,再新建list.html
文件,即:
my_blog
│ ...
├─article
│ ...
└─my_blog
│ ...
└─templates
└─ article
└─ list.html
細心的你肯定注意到了,之前的Django文件後綴都是.py
,代表Python文件;這裏的模板文件後綴是.html
,這又是什麼呢?
**HTML是一種用於創建網頁的標記語言。**它被用來結構化信息,標註哪些文字是標題、哪些文字是正文等(當然不僅僅這點功能)。也可以簡單理解爲“給數據排版”的文件,跟你寫文檔用的Office Word一樣一樣的 。
在list.html
文件中寫入:
templates/article/list.html
{% for article in articles %}
<p>{{ article.title }}</p>
{% endfor %}
作爲一個Web框架,Django通過模板來動態生成HTML,其中就包含描述動態內容的一些特殊語法:
-
{% for article in articles %}
:articles
爲視圖函數的context
傳遞過來的對象,即所有文章的集合。{% for %}
循壞表示依次取出articles
中的元素,命名爲article
,並分別執行接下來操作。末尾用{% endfor %}
告訴Django循環結束的位置。 -
使用
.
符號來訪問變量的屬性。這裏的article
爲模型中的某一條文章;我們在前面的ArticlePost
中定義了文章的標題叫title
,因此這裏可以用article.title
來訪問文章的標題。 -
<p>...</p>
即爲html語言,中間包裹了一個段落的文字。
在上一章中已經定義好了urls.py
,因此不再需要改動。
一切都很好,深吸一口氣。保存所有文件,在瀏覽器中輸入地址http://127.0.0.1:8000/article/article-list/
,得到以下錯誤:
似乎成功從來都不會很順利。
錯誤分析
雖然出錯了,但幸運的是Django提供了非常完善的錯誤處理系統,方便開發者快速找到Bug的蛛絲馬跡。
第一行就醒目地提示:TemplateDoesNotExist,說明Django沒有找到list.html
這個文件。仔細檢查目錄、文件的名稱無誤,沒問題就往下繼續看。
然後發現有這麼兩行:
...django\contrib\admin\templates\article\list.html (Source does not exist)
...django\contrib\auth\templates\article\list.html (Source does not exist)
似乎Django在這兩個位置搜索,沒有發現需要的文件,然後返回了“未發現模板文件”的錯誤。
定位了問題的所在,接下來就是在哪裏“告訴”Django我的模板的位置呢?
答案就在settings.py
中了,它保存了Django項目的各種初始配置。
打開並找到這一段,加入代碼os.path.join(BASE_DIR, 'templates')
:
my_blog/settings.py
TEMPLATES = [
{
...
# 定義模板位置
'DIRS': [os.path.join(BASE_DIR, 'templates')],
...
},
]
這就是說模板文件在項目根目錄的templates
文件夾中,去找找吧。
很好,保存文件,重新啓動服務器,刷新瀏覽器,如下:
成功!
雖然簡陋,但是已經完全走通了MTV(model、template、view)整個環路。
不要激動,精彩的還在後面。
總結
本章我們重寫了視圖,編寫了簡單的模板,和前面的模型成功關聯起來。
下一章將學習編寫一個漂亮的網頁模板。
- 有疑問請在杜賽的個人網站留言,我會盡快回復。
- 或Email私信我:[email protected]
- 項目完整代碼:Django_blog_tutorial
轉載請告知作者並註明出處。