摘要:本節接上周的文檔學習小組博客開發實戰第一周教程編寫博客的首頁面,我們繼續給博客添加功能,以及改善前面不合理的部分。返回該視圖要顯示的對象。目前小組正在完成第一個項目,本文即是該項目第二周的相關文檔。
本教程內容已過時,更新版教程請訪問: django 博客開發入門教程。
上周我們完成了博客的 Model 部分,以及 Blog 的首頁視圖 IndexView。
本節接上周的文檔 Django 學習小組:博客開發實戰第一周教程 —— 編寫博客的首頁面,我們繼續給博客添加功能,以及改善前面不合理的部分。本教程將帶你完成 Blog 的詳情頁面,即用戶點擊首頁的文章標題或者閱讀全文按鈕將跳轉到文章的詳情頁面來閱讀整篇文章。其次將調整一些目錄結構以使其在實踐應用中更加合理。
重寫URL提示:在閱讀教程的過程中,如有任何問題請訪問我們項目的 GithHub 或評論留言以獲取幫助,本教程的相關代碼已全部上傳在 Github。如果你對我們的教程或者項目有任何改進建議,請您通過隨時告知我們。更多交流請加入我們的郵件列表?django_study@groups.163.com。
對于一個有多個 app 的項目,把所有的 urlpatterns 都放在項目的 urls.py 似乎不是一個很合適的選擇,為此我們需要在 blog 文件夾下新建一個文件 urls.py ,把跟這個 app 相關的 urlpatterns 都放在這個文件里。
文件中的 urlpatterns 看不懂暫時沒關系,下面很快就會介紹它。
# blog/urls.py from django.conf.urls import url from blog import views urlpatterns = [ url(r"^blog/$", views.IndexView.as_view(), name="index"), url(r"^blog/article/(?Pd+)$", views.ArticleDetailView.as_view(), name="detail"), url(r"^blog/category/(?P d+)$", views.CategoryView.as_view(), name="category"), ] # 使用(?P<>d+)的形式捕獲值給<>中得參數,比如(?P d+),當訪問/blog/article/3時,將會將3捕獲給article_id,這個值會傳到views.ArticleDetailView,這樣我們就可以判斷展示哪個Article了
然后在項目的 urls.py 中包含(include)它:
# DjangoBlog/blog_project/urls.py from django.conf.urls import url, include from django.contrib import admin from blog import views urlpatterns = [ url(r"^admin/", admin.site.urls), url(r"", include("blog.urls", namespace="blog", app_name="blog")) ] # 其中namespace參數為我們指定了命名空間,這說明這個urls.py中的url是blog app下的,這樣即使不同的app下有相同url也不會沖突了。
這樣,我們就重寫了 URL,看起來是不是更有條理了?
新增文章詳情頁class ArticleDetailView(DetailView): # Django有基于類的視圖DetailView,用于顯示一個對象的詳情頁,我們繼承它 model = Article # 指定視圖獲取哪個model template_name = "blog/detail.html" # 指定要渲染的模板文件 context_object_name = "article" # 在模板中需要使用的上下文名字 pk_url_kwarg = "article_id" # 這里注意,pk_url_kwarg用于接收一個來自url中的主鍵,然后會根據這個主鍵進行查詢 # 我們之前在urlpatterns已經捕獲article_id # 指定以上幾個屬性,已經能夠返回一個DetailView視圖了,為了讓文章以markdown形式展現,我們重寫get_object()方法。 def get_object(self): obj = super(ArticleDetailView, self).get_object() obj.body = markdown2.markdown(object.body) return obj
get_object() 返回該視圖要顯示的對象。如果有設置 queryset,該queryset 將用于對象的源;否則,將使用get_queryset(). get_object()從視圖的所有參數中查找 pk_url_kwarg 參數; 如果找到了這個參數,該方法使用這個參數的值執行一個基于主鍵的查詢。
新建一個模板 detail.html 來展示我們的文章詳情
blog/templates/blog/detail.html {% extends "base.html" %} {% block content %}{% endblock %}{{ article.title }}
{{ article.last_modified_time|date:"Y年n月d日" }}{{ article.body |safe }}
整個執行流程就是這樣的:
假設用戶要訪問某篇文章,比如他點擊了某篇文章的標題,在模板文件中(首頁的模板,代碼可以參見 GitHub 上的 index.html),他點擊的就是這樣一個標簽:
{{ article.title }}
標簽是一個超鏈接,用戶點擊后會跳轉到由 href 指定的 url,這里我們使用了 django 自帶的模板標簽 url 標簽,它會自動解析 blog:detail 這個視圖函數對應的 url,并且把 article.pk(文章的主鍵)傳遞給detail 視圖函數 。detail 的 url 是這樣定義的:
url(r"^blog/article/(?Pd+)$", views.ArticleDetailView.as_view(), name="detail")
假設用戶點擊了第三篇文章,那么該 url 會被解析成:/blog/article/3,其中 3 被傳遞給了詳情頁面視圖函數。
現在視圖函數被調用,它首先根據傳給它的參數獲自動調用 get_object 方法取到文章的 model,然后根據 context_object_name = "article" 把 article 加入到上下文中(可以理解為攜帶著這個變量及其值并要傳遞給模板文件的對象,模板文件從這個對象中取出模板變量對應的值并替換。),之后渲染 template_name = "blog/detail.html" 指定的模板文件,至此用戶就跳轉到了文章詳情頁,效果如下:
新增分類視圖點擊某個分類,展示該分類下所有文章,其邏輯和首頁展示全部文章列表是一樣的,唯一不同的是我們獲取的不是全部文章,而是該分類下的文章。代碼如下:
class CategoryView(ListView): # 繼承自ListView,用于展示一個列表 template_name = "blog/index.html" # 指定需要渲染的模板 context_object_name = "article_list" # 指定模板中需要使用的上下文對象的名字 def get_queryset(self): #get_queryset 的作用已在第一篇中有介紹,不再贅述 article_list = Article.objects.filter(category=self.kwargs["cate_id"],status="p") # 注意在url里我們捕獲了分類的id作為關鍵字參數(cate_id)傳遞給了CategoryView,傳遞的參數在kwargs屬性中獲取。 for article in article_list: article.body = markdown2.markdown(article.body, ) return article_list # 給視圖增加額外的數據 def get_context_data(self, **kwargs): kwargs["category_list"] = Category.objects.all().order_by("name") # 增加一個category_list,用于在頁面顯示所有分類,按照名字排序 return super(CategoryView, self).get_context_data(**kwargs)
這里我們復用的是主頁的模板(因為展示的東西都是一樣的),點擊相應的分類,展示該分類下所有文章。同樣別忘了如果要用戶點擊分類按鈕跳轉到分類頁面的話,要指定 標簽的 href 屬性,善用 url 模板標簽,防止硬編碼 url,像這樣:
分類顯示效果如下,顯示分類二下的全部文章:
接下來做什么?至此,我們完成了博客的首頁,詳情展示頁以及分類功能,基本的框架算是完成了。接下來我們會為我們的 Blog 添加更多高級的功能,包括有標簽云、文章歸檔、文章分頁等。敬請期待我們下一周的教程。如果你希望為你的 Blog 添加其他更加獨特的功能,也請隨時告訴我們。
Django學習小組簡介django學習小組是一個促進 django 新手互相學習、互相幫助的組織。
小組在一邊學習 django 的同時將一起完成幾個項目,包括:
一個簡單的 django 博客,用于發布小組每周的學習和開發文檔;
django中國社區,為國內的 django 開發者們提供一個長期維護的 django 社區;
上面所說的這個社區類似于 segmentfault 和 stackoverflow ,但更加專注(只專注于 django 開發的問題)。
目前小組正在完成第一個項目,本文即是該項目第二周的相關文檔。
更多的信息請關注我們的?github 組織,本教程項目的相關源代碼也已上傳到 github 上。
同時,你也可以加入我們的郵件列表?django_study@groups.163.com?,隨時關注我們的動態。我們會將每周的詳細開發文檔和代碼通過郵件列表發出。
如有任何建議,歡迎提 issue,歡迎 fork,pr,當然也別忘了 star 哦!
合作推廣本系列教程將首發于 編程派 微信公眾號,編程派(微信號:codingpy)是一個專注Python編程的公眾號,每天更新有關Python的國外教程和優質書籍等精選干貨,掃描下方二維碼以關注:
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37991.html
摘要:本教程內容已過時,更新版教程請訪問博客開發入門教程。我們的評論表單放在中,評論成功后返回到原始提交頁面。學習小組簡介學習小組是一個促進新手互相學習互相幫助的組織。 本教程內容已過時,更新版教程請訪問: django 博客開發入門教程。 通過前四周的時間我們開發了一個簡單的個人 Blog,前幾期教程地址: 第一周:Django 學習小組:博客開發實戰第一周教程 —— 編寫博客的 Mode...
摘要:本教程內容已過時,更新版教程請訪問博客開發入門教程。我們的評論表單放在中,評論成功后返回到原始提交頁面。學習小組簡介學習小組是一個促進新手互相學習互相幫助的組織。 本教程內容已過時,更新版教程請訪問: django 博客開發入門教程。 通過前四周的時間我們開發了一個簡單的個人 Blog,前幾期教程地址: 第一周:Django 學習小組:博客開發實戰第一周教程 —— 編寫博客的 Mode...
摘要:本教程內容已過時,更新版教程請訪問博客開發入門教程。表示降序排列,默認是升序排列。學習小組簡介學習小組是一個促進新手互相學習互相幫助的組織。我們會將每周的詳細開發文檔和代碼通過郵件列表發出。 本教程內容已過時,更新版教程請訪問: django 博客開發入門教程。 通過前四周的時間我們開發了一個簡單的個人 Blog,教程地址: 第一周:Django 學習小組:博客開發實戰第一周教程 ——...
摘要:本教程首先介紹兩個項目中遇到的通用視圖和。語句的作用是添加了到上下文中,還要把默認的一些上下文變量也返回給視圖函數,以便其后續處理。 通過三周的時間我們開發了一個簡單的個人 Blog,教程地址: 第一周:Django 學習小組:博客開發實戰第一周教程 —— 編寫博客的 Model 和首頁面 第二周:Django 學習小組:博客開發實戰第二周教程 —— 博客詳情頁面和分類頁面 第三周:D...
摘要:本教程內容已過時,更新版教程請訪問博客開發入門教程。當分頁較多時,總是顯示當前頁及其前幾頁和后幾頁的頁碼教程中使用的是兩頁,其他頁碼用省略號代替。 本教程內容已過時,更新版教程請訪問: django 博客開發入門教程。 摘要:前兩期教程我們實現了博客的 Model 部分,以及 Blog 的首頁視圖 IndexView,詳情頁面 DetailView,以及分類頁面 CategoryVi...
閱讀 3078·2021-11-24 09:38
閱讀 1330·2021-09-22 15:27
閱讀 2968·2021-09-10 10:51
閱讀 1504·2021-09-09 09:33
閱讀 917·2021-08-09 13:47
閱讀 2072·2019-08-30 13:05
閱讀 892·2019-08-29 15:15
閱讀 2425·2019-08-29 12:21