Django博客--4.開發博客文章詳情頁

文章目錄

    • 0.思路引導
    • 1.設計文章詳情頁的 URL
    • 2.獲取文章的URL
    • 3.編寫 detail 視圖函數
    • 4.編寫詳情頁模板
    • 5.更改主頁中跳轉詳情頁的地址鏈接
    • 6.模板繼承--抽取base.html
    • 7.模板繼承--修改 index.html使其繼承base.html
    • 8.模板繼承--修改detail.html使其繼承base.html
    • 9.結果展示

0.思路引導

情景:博客首頁展示的是所有文章的列表,當用戶看到感興趣的文章時,點擊文章的標題或者繼續閱讀的按鈕,應該跳轉到文章的詳情頁面來閱讀文章的詳細內容。
實現方式:首先配置 URL,即把相關的 URL 和視圖函數綁定在一起,然后實現視圖函數,編寫模板并讓視圖函數渲染模板。
邏輯總結
1)用戶進入博客首頁時,根據blog/urls.py中路由的地址,調用視圖函數中views.py的index()函數,此步驟一方面從后端獲取全部文章的數據(注意每篇文章都有一個pk,也即文章id),另一方面將數據返回到index.html并展示給用戶;
在這里插入圖片描述2)用戶點擊對內容感興趣的博客(點擊文章標題或者“繼續閱讀”)時,調用models.py中的get_absolute_url()函數;
在這里插入圖片描述在這里插入圖片描述
目的是返回用戶點擊文章的pk,推送給路由中‘blog:datail’指定的視圖,即views.py中的detail()函數;

在這里插入圖片描述
在這里插入圖片描述3)detail()函數根據文章的pk,從后臺數據庫中獲取數據,將數據推送到detail.html并展示給用戶。

1.設計文章詳情頁的 URL

文件位置:blog/urls.py

from django.urls import pathfrom . import viewsapp_name = 'blog'
urlpatterns = [path('', views.index, name='index'),path('posts/<int:pk>/', views.detail, name='detail'),
]

此外我們通過 app_name=‘blog’ 告訴 django 這個 urls.py 模塊是屬于 blog 應用的

2.獲取文章的URL

文件位置:blog/models.py


from django.contrib.auth.models import User
from django.db import models
from django.urls import reverse
from django.utils import timezoneclass Post(models.Model):...def __str__(self):return self.title# 自定義 get_absolute_url 方法# 記得從 django.urls 中導入 reverse 函數def get_absolute_url(self):return reverse('blog:detail', kwargs={'pk': self.pk})

3.編寫 detail 視圖函數

文件位置:blog/views.py

from django.shortcuts import render, get_object_or_404
from .models import Postdef index(request):# ...def detail(request, pk):post = get_object_or_404(Post, pk=pk)return render(request, 'blog/detail.html', context={'post': post}

4.編寫詳情頁模板

從下載的博客模板中,把 single.html 拷貝到 templates\blog 目錄下(和 index.html 在同一級目錄),然后改名為 detail.html

5.更改主頁中跳轉詳情頁的地址鏈接

文件位置:templates/blog/index.html

<article class="post post-{{ post.pk }}"><header class="entry-header"><h1 class="entry-title"><a href="{{ post.get_absolute_url }}">{{ post.title }}</a></h1>...</header><div class="entry-content clearfix">...<div class="read-more cl-effect-14"><a href="{{ post.get_absolute_url }}" class="more-link">繼續閱讀 <span class="meta-nav"></span></a></div></div>
</article>
{% empty %}<div class="no-post">暫時還沒有發布的文章!</div>
{% endfor %}

在這里更改兩個位置,第一個是文章標題處:

<h1 class="entry-title"><a href="{{ post.get_absolute_url }}">{{ post.title }}</a>
</h1>

第二處修改的是繼續閱讀按鈕的鏈接:

<a href="{{ post.get_absolute_url }}" class="more-link">繼續閱讀 <span class="meta-nav"></span>
</a>

6.模板繼承–抽取base.html

首先在 templates\ 目錄下新建一個 base.html 文件,可以看到 index.html 文件和 detail.html 文件除了 main 標簽包裹的部分不同外,其它地方都是相同的,我們可以把相同的部分抽取出來,放到 base.html 里;

把 index.html 的內容全部拷貝到 base.html 文件里,然后刪掉 main 標簽包裹的內容,替換成如下的內容:

...
<main class="col-md-8">{% block main %}{% endblock main %}
</main>
<aside class="col-md-4">{% block toc %}{% endblock toc %}...
</aside>
...

這里的 {% block main %}{% endblock main %} 是一個占位框,main 是我們給這個 block 取的名字。

同時我們也在 aside 標簽下加了一個 {% block toc %}{% endblock toc %} 占位框,因為 detail.html 中 aside 標簽下會多一個目錄欄。

當 {% block toc %}{% endblock toc %} 中沒有任何內容時,{% block toc %}{% endblock toc %} 在模板中不會顯示。但當其中有內容是,模板就會顯示 block 中的內容。

7.模板繼承–修改 index.html使其繼承base.html

在 index.html 里,我們在文件最頂部使用 {% extends ‘base.html’ %} 繼承 base.html,這樣就把 base.html 里的代碼繼承了過來,另外在 {% block main %}{% endblock main %} 包裹的地方填上 index 頁面應該顯示的內容:

文件位置:templates/blog/index.html

{% extends 'base.html' %}{% block main %}{% for post in post_list %}<article class="post post-1">...</article>{% empty %}<div class="no-post">暫時還沒有發布的文章!</div>{% endfor %}<!-- 簡單分頁效果<div class="pagination-simple"><a href="#">上一頁</a><span class="current">6/11</span><a href="#">下一頁</a></div>--><div class="pagination">...</div>
{% endblock main %}

8.模板繼承–修改detail.html使其繼承base.html

在 {% block main %}{% endblock main %} 里填充 detail.html 頁面應該顯示的內容,以及在 {% block toc %}{% endblock toc %} 中填寫 base.html 中沒有的目錄部分的內容。

文件位置:templates/blog/detail.html


{% extends 'base.html' %}{% block main %}<article class="post post-1">...</article><section class="comment-area">...</section>
{% endblock main %}
{% block toc %}<div class="widget widget-content"><h3 class="widget-title">文章目錄</h3><ul><li><a href="#">教程特點</a></li><li><a href="#">誰適合這個教程</a></li><li><a href="#">在線預覽</a></li><li><a href="#">資源列表</a></li><li><a href="#">獲取幫助</a></li></ul></div>
{% endblock toc %}

并修改上述文件中, article 標簽下的一些內容為模板變量,讓其顯示文章的實際數據:

<article class="post post-{{ post.pk }}"><header class="entry-header"><h1 class="entry-title">{{ post.title }}</h1><div class="entry-meta"><span class="post-category"><a href="#">{{ post.category.name }}</a></span><span class="post-date"><a href="#"><time class="entry-date"datetime="{{ post.created_time }}">{{ post.created_time }}</time></a></span><span class="post-author"><a href="#">{{ post.author }}</a></span><span class="comments-link"><a href="#">4 評論</a></span><span class="views-count"><a href="#">588 閱讀</a></span></div></header><div class="entry-content clearfix">{{ post.body }}</div>
</article>

9.結果展示

再次從首頁點擊一篇文章的標題或者繼續閱讀按鈕跳轉到詳情頁面,可以看到效果如下:
在這里插入圖片描述
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/452517.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452517.shtml
英文地址,請注明出處:http://en.pswp.cn/news/452517.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

10、并發容器,ConcurrentHashMap

Java 提供了不同層面的線程安全支持。在傳統集合框架內部&#xff0c;除了 Hashtable 等同步容器&#xff0c;還提供了所謂的同步包裝器&#xff08;Synchronized Wrapper&#xff09;&#xff0c;我們可以調用 Collections 工具類提供的包裝方法&#xff0c;來獲取一個同步的包…

程序員的本質

Computers are useless. They can only give you answers. – Picasso計算機沒有什么作用。他們只能告訴你答案。——畢加索很多人&#xff08;包括我岳母&#xff09;認為計算機變得如此智能&#xff0c;所以在不久的未來將不再需要程序員。另外一些人認為程序員是天才&#x…

模式-視圖-控制器模式2.0

1 MVC的實現   1.1 分析應用問題&#xff0c;對系統進行分離   分析應用問題&#xff0c;分離出系統的內核功能、對功能的控制輸入、系統的輸出行為三大部分。設計模型部件使其封裝內核數據和計算功能&#xff0c;提供訪問顯示數據的操作&#xff0c;提供控制內部行為的操作…

總體設計的原理

1 模塊化 2 抽象 3 逐步求精 4 信息隱藏和局部化 5 模塊獨立

android 手動回收對象,Android Studio Studio回收列表中的JSON對象

我想在recyclerview中顯示一些JSON對象&#xff0c;并且希望它們在日期之后排序&#xff0c;我該如何實現&#xff1f;下面是下載從JSON URL的數據的方法&#xff1a;Android Studio Studio回收列表中的JSON對象public void downloadFromSkistar(){try{URL url new URL("…

剖析管理所有大數據組件的可視化利器:Hue

歡迎關注大數據和人工智能技術文章發布的微信公眾號&#xff1a;清研學堂&#xff0c;在這里你可以學到夜白&#xff08;作者筆名&#xff09;精心整理的筆記&#xff0c;讓我們每天進步一點點&#xff0c;讓優秀成為一種習慣&#xff01; 日常的大數據使用都是在服務器命令行中…

Django博客--5.讓博客支持 Markdown 語法和代碼高亮

文章目錄0.前言1.安裝 Python Markdown2.在 detail 視圖中解析 Markdown3.safe 標簽4.代碼高亮5.效果展示0.前言 Markdown 是一種 HTML 文本標記語言&#xff0c;只要遵循它約定的語法格式&#xff0c;Markdown 的解析工具就能夠把 Markdown 文檔轉換為標準的 HTML 文檔&#…

耦合

模塊的獨立性很重要&#xff0c;因為有效的模塊化(即具有獨立的模塊)的軟件比較容易開發出來。 獨立的模塊比較容易測試和維護。 模塊的獨立程度可以由兩個定性標準度量&#xff0c;這兩個標準分別稱為內聚和耦合。 耦合 耦合是對一個軟件結構內不同模塊之間互連程度的度量。…

成為更優秀的開發人員:第二步-知道你的核心競爭力

編者按&#xff1a;原文作者羅布沃林&#xff08;Rob Walling&#xff09;從事Web應用開發10年之久&#xff0c;擔任過業內顧問、自由開發人員和全球最大的信用卡預付公司City of Pasadena的開發經理。現居住于加州中部城市弗雷斯諾&#xff08;Fresno&#xff09;。關注并指導…

android 字體間間隔,TextView設置行間距、字體間距

一、設置行間距1、設置行間距&#xff1a;android:lineSpacingExtra&#xff0c;取值范圍&#xff1a;正數、負數和0&#xff0c;正數表示增加相應的大小&#xff0c;負數表示減少相應的大小&#xff0c;0表示無變化2、設置行間距的倍數&#xff1a;android:lineSpacingMultipl…

破解mysql數據庫的密碼

發現的1小問題 語句打錯以后應該退出本語句,再繼續打新語句.也可以打\c,退出本語句. 如何破解數據庫的密碼: 1:通過任務管理器或者服務管理,關掉mysqld(服務進程) 2:通過命令行特殊參數開啟mysqld Mysqld --skip-grant-tables 3:此時,mysqld服務進程已經打開,并且,不需要權限檢…

Diango博客--6.Markdown 文章自動生成目錄

文章目錄0.思路引導1.在文中插入目錄2.在頁面的任何地方插入目錄3.美化標題的錨點 URL0.思路引導 Markdown 在解析內容的同時還可以自動提取整個內容的目錄結構&#xff0c;本文內容將從以下幾個方面展開&#xff1a; 1&#xff09;在文中插入目錄&#xff1b; 2&#xff09;在…

Java中對象和引用的理解

2019獨角獸企業重金招聘Python工程師標準>>> 偶然想起Java中對象和引用的基本概念&#xff0c;為了加深下對此的理解和認識&#xff0c;特地整理一下相關的知識點&#xff0c;通過具體實例從兩者的概念和區別兩方面去更形象的認識理解&#xff0c;再去記憶。12一、對…

android怎樣封裝,如何封裝屬于自己的博客網站安卓APP 源碼家園

說實話我今天在寫這個文章的時候是我使用易語言(E4A\易安卓)的第一天&#xff0c;我也是易小白&#xff0c;但是的確可以用&#xff01;我為什么寫這個文章呢&#xff1f;因為之前我也想封裝自己的網站&#xff0c;然后去網上找的在線封裝生成APP&#xff0c;果然能封裝好了&am…

程序員常犯的5個非技術性錯誤

一個好的軟件開發人員需要培養兩種技能&#xff1a;技術技能和非技術技能。不幸的是一些開發者只注重技術的部分&#xff0c;以致養成一些陋習&#xff0c;下面是最常犯的5個非技術性錯誤&#xff1a; 0. 缺乏自律 Jim Rohn曾經說過&#xff1a;自律是目標和成果之間的橋梁。我…

Redis進階實踐之二十 Redis的配置文件使用詳解

一、引言   寫完上一篇有關redis使用lua腳本的文章&#xff0c;就有意結束Redis這個系列的文章了&#xff0c;當然了&#xff0c;這里的結束只是我這個系列的結束&#xff0c;但是要學的東西還有很多。但是&#xff0c;好多天過去了&#xff0c;總是感覺好像還缺點什么…

web流程設計器 工作流的 整合視頻教程 activiti畫圖 SSM和獨立部署

本視頻為activiti工作流的web流程設計器整合視頻教程整合Acitiviti在線流程設計器(Activiti-Modeler 5.21.0 官方流程設計器&#xff09;本視頻共講了兩種整合方式1. 流程設計器和其它工作流項目分開部署的方式2. 流程設計器和SSM框架項目整合在一起的方式視頻大小 1.13 GB ~【…

Diango博客--7.自動生成文章摘要

文章目錄0.思路引導1.方法一&#xff1a;覆寫 save 方法2.方法二&#xff1a;使用 truncatechars 模板過濾器0.思路引導 博客文章的模型有一個 excerpt 字段&#xff0c;這個字段用于存儲文章的摘要。 若在 django admin 后臺手動為文章輸入摘要&#xff0c;每次手動輸入摘要…

android 增加觸摸范圍,android seekBar 增加點擊和滑動范圍

seekBar的的范圍有限&#xff0c;有時候設計師要求高度為4dp&#xff0c;此時范圍太小&#xff0c;很難滑動成功。因此&#xff0c;我們需要在不改變 UI 的前提下&#xff0c;增加點擊和滑動范圍。直接上代碼&#xff1a;public class MainActivity extends AppCompatActivity …