有了文章列表頁面後,當然還需要詳情頁面,方便用戶對某一篇感興趣的文章深入閱讀。
編寫視圖函數
打開article/views.py
,增加文章詳情頁面的視圖函數article_detail()
:
article/views.py
...
# 文章詳情
def article_detail(request, id):
# 取出相應的文章
article = ArticlePost.objects.get(id=id)
# 需要傳遞給模板的對象
context = { 'article': article }
# 載入模板,並返回context對象
return render(request, 'article/detail.html', context)
article_detail(request, id)
函數中多了id
這個參數。**注意我們在寫model的時候並沒有寫叫做id的字段,**這是Django自動生成的用於索引數據表的主鍵(Primary Key,即pk)。有了它纔有辦法知道到底應該取出哪篇文章。ArticlePost.objects.get(id=id)
意思是在所有文章中,取出id值相符合的唯一的一篇文章。
然後編寫article/urls.py
,配置路由地址:
article/urls.py
...
urlpatterns = [
...
# 文章詳情
path('article-detail/<int:id>/', views.article_detail, name='article_detail'),
]
<int:id>
:Django2.0的path
新語法用**尖括號<>**定義需要傳遞的參數。這裏需要傳遞名叫id
的整數到視圖函數中去。
重申一下老版本的Django是沒有path
語法的。
編寫模板
在templates/article/
中新建detail.html
文件,編寫如下代碼:
templates/article/detail.html
<!-- extends表明此頁面繼承自 base.html 文件 -->
{% extends "base.html" %}
{% load staticfiles %}
<!-- 寫入 base.html 中定義的 title -->
{% block title %}
文章詳情
{% endblock title %}
<!-- 寫入 base.html 中定義的 content -->
{% block content %}
<!-- 文章詳情 -->
<div class="container">
<div class="row">
<!-- 標題及作者 -->
<h1 class="col-12 mt-4 mb-4">{{ article.title }}</h1>
<div class="col-12 alert alert-success">作者:{{ article.author }}</div>
<!-- 文章正文 -->
<div class="col-12">
<p>{{ article.body }}</p>
</div>
</div>
</div>
{% endblock content %}
這裏我們用{{ article.xxx }}
取出了文章標題、作者以及正文。
前面我們已經通過後臺創建了幾篇文章,這裏將取出id爲1的一篇文章測試效果。
運行開發服務器後,在瀏覽器中輸入http://127.0.0.1:8000/article/article-detail/1/
:
優化網頁入口
雖然已經實現了文章詳情功能,但是通過輸入url訪問的方式實在太不友好。
改寫header.html
,讓用戶可通過導航欄右側的文章鏈接返回首頁:
templates/header.html
...
<div>
<ul class="navbar-nav">
<li class="nav-item">
<!-- 改寫了這裏的 href -->
<a class="nav-link" href="{% url 'article:article_list' %}">文章</a>
</li>
</ul>
</div>
...
注意看這裏href是如何改寫的:
- href定義了鏈接跳轉的地址
{% url '...' %}
是Django規定的語法,用於指明具體地址- 關於其中的
'article:article_list'
的解釋:- 前面的
article
是在項目根目錄的urls.py
中定義的app的名稱 - 後面的
article_list
是在app中的urls.py
中定義的具體的路由地址
- 前面的
通過這樣的方法就將鏈接跳轉的指向給配置好了,只要對應url的名稱不變,url本身無論怎麼變化,Django都可以解析到正確的地址,很靈活。
當然你也可以直接在href
中寫入url的地址,但是一旦url有變化,所有相關的鏈接都會失效,降低維護性。
然後再改寫list.html
,讓用戶可點擊閱讀本文按鈕進入文章詳情:
templates/article/list.html
...
<div class="card-footer">
<!-- 同樣改寫 href -->
<a href="{% url 'article:article_detail' article.id %}" class="btn btn-primary">閱讀本文</a>
</div>
...
留意文章的id是如何傳遞的:
- 在
list.html
中,通過href="{% url 'article:article_detail' article.id %}"
,將id傳遞給article/urls.py
- 在
article/urls.py
中,通過<int:id>
傳遞給視圖函數article_detail()
- 在視圖函數
article_detail()
中,通過形參id
取得了文章的id值,並進行處理,最終定位了需要獲取的文章對象
現在我們可以通過鏈接訪問網站上的不同頁面了,而不需要手動輸入url。當然這也是現代網站的基礎。
總結
現在我們也擁有查看文章詳情的功能了,並且優化了網頁切換的體驗。
下一章將學習使用Markdown語法對文章正文進行排版。
- 有疑問請在杜賽的個人網站留言,我會盡快回復。
- 或Email私信我:[email protected]
- 項目完整代碼:Django_blog_tutorial
轉載請告知作者並註明出處。