既然有了寫文章的功能,那當然也必須要有刪除文章的功能了。
編寫基本功能
有了之前的學習做鋪墊,刪除文章實現起來就比較簡單了。
首先增加一個視圖函數:
article/views.py
...
# 刪文章
def article_delete(request, id):
# 根據 id 獲取需要刪除的文章
article = ArticlePost.objects.get(id=id)
# 調用.delete()方法刪除文章
article.delete()
# 完成刪除後返回文章列表
return redirect("article:article_list")
- 與查詢文章類似,因爲需要知道具體應該刪除哪一篇文章,因此必須傳入文章的
id
; - 緊接着調用
.delete()
函數刪除數據庫中這篇文章的條目; - 刪除成功後返回到文章列表。
這裏與上一章一樣,不對用戶的身份進行限制,即任何人都可以刪除任意文章。當然這樣肯定是不符合常理的,等到我們學習了用戶管理的知識後,再回頭來修改。
然後寫入路由信息:
article/urls.py
...
urlpatterns = [
...
# 刪除文章
path('article-delete/<int:id>/', views.article_delete, name='article_delete'),
]
這裏幾乎與文章詳情的寫法一樣,沒有新的內容。再次注意文章的id是如何傳遞到視圖中的。
最後我們希望能夠在文章詳情的頁面進行刪除的操作(當然也可以在專門的管理文章的頁面中),因此修改模板detail.html
:
templates/article/detail.html
...
<!-- 文章詳情 -->
<div class="container">
<div class="row">
...
<div class="col-12 alert alert-success">作者:{{ article.author }}
· <a href="{% url "article:article_delete" article.id %}">刪除文章</a>
</div>
...
</div>
</div>
...
這裏增加了一個調用article_delete
視圖函數的鏈接,並且將article.id
傳遞進去。
運行開發服務器,可以發現已經能夠正常的刪除文章了:
增加彈窗
功能已經實現了,但是還有個小問題沒有解決:萬一我只是不小心點到了鏈接,辛辛苦苦寫的文章就被刪除了,豈不是欲哭無淚了?
很容易想到的一個解決方法,就是點擊刪除按鈕是出現一個彈窗,確認後再進行刪除,確保用戶不是誤操作的。
彈窗是很常用的功能,但是想寫出一個美觀好用的彈窗卻不容易。幸運的是我們不需要重複造輪子,早就有革命先驅做好相關的功能了,這裏我們選擇使用Layer彈窗組件。
layer是一款備受青睞的web彈層組件,具備全方位的解決方案。首先到官網下載Layer插件:Layer
解壓後將裏面的**layer文件夾(含有layer.js的)**直接複製到項目的static
文件夾下。
爲了未來在所有頁面都能使用Layer彈窗功能,在base.html
中通過標籤引入:
templates/base.html
...
<body>
...
<!-- bootstrap.js 依賴 jquery.js 和popper.js,因此在這裏引入 -->
<script src="{% static 'jquery/jquery-3.3.1.js' %}"></script>
...
<!-- 引入layer.js -->
<script src="{% static 'layer/layer.js' %}"></script>
</body>
...
layer插件依賴jquery才能正常工作,因此要在jquery的後面引入layer。
再次改寫模板文件detail.html
:
templates/article/detail.html
...
<!-- 文章詳情 -->
<div class="container">
<div class="row">
...
<div class="col-12 alert alert-success">作者:{{ article.author }}
· <a href="#" onclick="confirm_delete()">刪除文章</a>
</div>
...
</div>
</div>
<script>
// 刪除文章的函數
function confirm_delete() {
// 調用layer彈窗組件
layer.open({
// 彈窗標題
title: "確認刪除",
// 正文
content: "確認刪除這篇文章嗎?",
// 點擊確定按鈕後調用的回調函數
yes: function(index, layero) {
// 指定應當前往的 url
location.href='{% url "article:article_delete" article.id %}'
},
})
}
</script>
{% endblock content %}
這裏將href
鏈接去除掉,增加了onclick
屬性,表示在點擊鏈接的時候調用後面的confirm_delete()
函數;函數中調用了layer彈窗組件,對彈窗的標題、正文以及點擊確定鍵的行爲作出了規定(當然Layer組件遠不止這些用法,具體可在官方文檔中查閱)。location.href
定義了點擊確定鍵後應該前往的地址,即刪除文章的url。
保存所有文件後刷新頁面,很好,達到了理想的效果:
總結
本章新增了刪除博客文章的功能,並且使用了彈窗組件優化了用戶體驗。
下一章將學習如何更新文章,準備好繼續作戰吧。
- 有疑問請在杜賽的個人網站留言,我會盡快回復。
- 或Email私信我:[email protected]
- 項目完整代碼:Django_blog_tutorial
轉載請告知作者並註明出處。