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。

保存所有文件后刷新页面,很好,达到了理想的效果:

总结

本章新增了删除博客文章的功能,并且使用了弹窗组件优化了用户体验。

下一章将学习如何更新文章,准备好继续作战吧。

转载请告知作者并注明出处。

转载于:https://juejin.im/post/5bbb441c6fb9a05d1b2e6f1a

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值