日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

自动填充html_第 11 篇:自动生成文章摘要

發(fā)布時(shí)間:2025/3/12 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自动填充html_第 11 篇:自动生成文章摘要 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

作者:HelloGitHub-追夢(mèng)人物

文中涉及的示例代碼,已同步更新到 [HelloGitHub-Team 倉(cāng)庫(kù)](https://github.com/HelloGitHub-Team/HelloDjango-blog-tutorial)

博客文章的模型有一個(gè) excerpt 字段,這個(gè)字段用于存儲(chǔ)文章的摘要。目前為止,還只能在 django admin 后臺(tái)手動(dòng)為文章輸入摘要。每次手動(dòng)輸入摘要比較麻煩,對(duì)有些文章來說,只要摘取正文的前 N 個(gè)字符作為摘要,以便提供文章預(yù)覽就可以了。因此我們來實(shí)現(xiàn)如果文章沒有輸入摘要,則自動(dòng)摘取正文的前 N 個(gè)字符作為摘要,這有兩種實(shí)現(xiàn)方法。

覆寫 save 方法

第一種方法是通過覆寫模型的 save 方法,從正文字段摘取前 N 個(gè)字符保存到摘要字段。在 創(chuàng)作后臺(tái)開啟,請(qǐng)開始你的表演 中我們提到過 save 方法中執(zhí)行的是保存模型實(shí)例數(shù)據(jù)到數(shù)據(jù)庫(kù)的邏輯,因此通過覆寫 save 方法,在保存數(shù)據(jù)庫(kù)前做一些事情,比如填充某個(gè)缺失字段的值。

回顧一下博客文章模型代碼:

blog/models.pyclass Post(models.Model):# 其它字段...body = models.TextField()excerpt = models.CharField(max_length=200, blank=True)def save(self, *args, **kwargs):self.modified_time = timezone.now()super().save(*args, **kwargs)

其中 body 字段存儲(chǔ)的是正文,excerpt 字段用于存儲(chǔ)摘要。通過覆寫模型的 save 方法,在數(shù)據(jù)被保存到數(shù)據(jù)庫(kù)前,先從 body 字段摘取 N 個(gè)字符保存到 excerpt 字段中,從而實(shí)現(xiàn)自動(dòng)摘要的目的。具體代碼如下:

blog/models.pyimport markdown from django.utils.html import strip_tagsclass Post(models.Model):# 其它字段...body = models.TextField()excerpt = models.CharField(max_length=200, blank=True)# 其它方法...def save(self, *args, **kwargs):self.modified_time = timezone.now()# 首先實(shí)例化一個(gè) Markdown 類,用于渲染 body 的文本。# 由于摘要并不需要生成文章目錄,所以去掉了目錄拓展。md = markdown.Markdown(extensions=['markdown.extensions.extra','markdown.extensions.codehilite',])# 先將 Markdown 文本渲染成 HTML 文本# strip_tags 去掉 HTML 文本的全部 HTML 標(biāo)簽# 從文本摘取前 54 個(gè)字符賦給 excerptself.excerpt = strip_tags(md.convert(self.body))[:54]super().save(*args, **kwargs)

這里生成摘要的方案是,先將 body 中的 Markdown 文本轉(zhuǎn)為 HTML 文本,去掉 HTML 文本里的 HTML 標(biāo)簽,然后摘取文本的前 54 個(gè)字符作為摘要。去掉 HTML 標(biāo)簽的目的是防止前 54 個(gè)字符中存在塊級(jí) HTML 標(biāo)簽而使得摘要格式比較難看。可以看到很多網(wǎng)站都采用這樣一種生成摘要的方式。

然后在模板中適當(dāng)?shù)牡胤绞褂媚0鍢?biāo)簽引用 {{ post.excerpt }} 顯示摘要的值即可:

templates/blog/index.html<article class="post post-{{ post.pk }}">...<div class="entry-content clearfix"><p>{{ post.excerpt }}...</p><div class="read-more cl-effect-14"><a href="{{ post.get_absolute_url }}" class="more-link">繼續(xù)閱讀 <span class="meta-nav">→</span></a></div></div> </article>

新添加一篇文章(這樣才能觸發(fā) save 方法,此前添加的文章不會(huì)自動(dòng)生成摘要,要手動(dòng)保存一下觸發(fā) save 方法),可以看到摘要效果了。

使用 truncatechars 模板過濾器

第二種方法是使用 truncatechars 模板過濾器(Filter)。在 django 的模板系統(tǒng)中,模板過濾器的使用語法為 {{ var | filter: arg }}。可以將模板過濾看做一個(gè)函數(shù),它會(huì)作用于被它過濾的模板變量,從而改變模板變量的值。例如這里的 truncatechars 過濾器可以截取模板變量值的前 N 個(gè)字符顯示。關(guān)于模板過濾器,我們之前使用過 safe 過濾器,可以參考 讓博客支持 Markdown 語法和代碼高亮 這篇文章中對(duì)模板過濾器的說明。

例如摘要效果,需要顯示 post.body 的前 54 的字符,那么可以在模板中使用 {{ post.body | truncatechars:54 }}。

templates/blog/index.html<article class="post post-{{ post.pk }}">...<div class="entry-content clearfix"><p>{{ post.body|truncatechars:54 }}</p><div class="read-more cl-effect-14"><a href="{{ post.get_absolute_url }}" class="more-link">繼續(xù)閱讀 <span class="meta-nav">→</span></a></div></div> </article>

不過這種方法的一個(gè)缺點(diǎn)就是如果前 54 個(gè)字符含有塊級(jí) HTML 元素標(biāo)簽的話(比如一段代碼塊),會(huì)使摘要比較難看。所以推薦使用第一種方法。

歡迎關(guān)注 HelloGitHub 公眾號(hào),獲取更多開源項(xiàng)目的資料和內(nèi)容

『講解開源項(xiàng)目系列』啟動(dòng)——讓對(duì)開源項(xiàng)目感興趣的人不再畏懼、讓開源項(xiàng)目的發(fā)起者不再孤單。跟著我們的文章,你會(huì)發(fā)現(xiàn)編程的樂趣、使用和發(fā)現(xiàn)參與開源項(xiàng)目如此簡(jiǎn)單。歡迎聯(lián)系我們給我們投稿,讓更多人愛上開源、貢獻(xiàn)開源~

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的自动填充html_第 11 篇:自动生成文章摘要的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。