Django搭建個人博客:編寫刪除文章功能

既然有了寫文章的功能,那當然也必須要有刪除文章的功能了。

編寫基本功能

有了之前的學習做鋪墊,刪除文章實現起來就比較簡單了。

首先增加一個視圖函數:

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。

保存所有文件後刷新頁面,很好,達到了理想的效果:

總結

本章新增了刪除博客文章的功能,並且使用了彈窗組件優化了用戶體驗。

下一章將學習如何更新文章,準備好繼續作戰吧。

轉載請告知作者並註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章