Django搭建个人博客:编写删除文章功能

news/2023/12/9 15:39:52 标签: python, javascript, 数据库

既然有了写文章的功能,那当然也必须要有删除文章的功能了。

编写基本功能

有了之前的学习做铺垫,删除文章实现起来就比较简单了。

首先增加一个视图函数:

python">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()函数删除数据库中这篇文章的条目;
  • 删除成功后返回到文章列表。

这里与上一章一样,不对用户的身份进行限制,即任何人都可以删除任意文章。当然这样肯定是不符合常理的,等到我们学习了用户管理的知识后,再回头来修改。

然后写入路由信息:

python">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私信我:dusaiphoto@foxmail.com
  • 项目完整代码:Django_blog_tutorial
转载请告知作者并注明出处。

http://www.niftyadmin.cn/n/975511.html

相关文章

gulp简介

简介 gulp是基于Nodejs的自动任务运行器&#xff0c; 她能自动化地完成 javascript/coffee/sass/less/html/image/css 等文件的的测试、检查、合并、压缩、格式化、浏览器自动刷新、部署文件生成&#xff0c;并监听文件在改动后重复指定的这些步骤。在实现上&#xff0c;她借鉴…

JS排序算法总结:八种算法对比

目的&#xff1a;掌握 排序算法的分类及不同算法复杂度的对比、搞清楚 XXX与数组初始状态无关分为几种情况&#xff1a; a、算法复杂度与初始状态无关&#xff1b; b、元素总比较次数与初始状态无关&#xff1b; c、元素总移动次数与初始状态无关。 1、算法分类 十种常见排序算…

L145

实践是检验真理的唯一标准。Only social practice can be the criterion of truth.工会负责人谴责这一行动破坏了协议。Union officials denounced the action as a breach of the agreement.为了购买新房子,他决定放弃旅行.He decided to sacrifice a trip for a new house.警…

sklearn中的线性回归大家族

1 概述 1.1 线性回归大家族 回归是一种应用广泛的预测建模技术&#xff0c;这种技术的核心在于预测的结果是连续型变量。决策树、随机森林、支持向量机的分类器等分类算法的预测标签是分类变量&#xff0c;多以{0,1}来表示&#xff0c;而无监督学习算法&#xff08;如CPA、Km…

fpm制作rpm包的准备工作

# uname -r 2.6.32-642.el6.x86_64 # cat /etc/redhat-release CentOS release 6.8 (Final)一 首先安装ruby 备注:&#xff08;我使用centos yum 安装的最新版本也是1.87&#xff0c;安装fpm包会提示版本太低必须是1.9.3 之后的版本。&#xff09;1.安装RVM(Ruby 版本管理器)c…

小程序进阶之路

新公司入职要求会小程序&#xff0c;先学习一下就从官方API开始&#xff0c;官方有的东西就不重复了&#xff0c;写一下我自己发现的东西。 1.关于页面跳转 官方是这样写的&#xff0c;大概看一下打开新页面&#xff0c;页面重定向和页面返回没差&#xff0c;都是从一个页面到另…

我是不是一个不愿意自己多努力,还老是跟别人吐槽公司这不好那不好的人

最近看的一些自己喜欢的文章中的句子摘录、、、 ------------------ 要么和自己的平庸握手言和&#xff0c;要么努力配得上自己的理想也许你愤世恶俗的原因&#xff0c;就是因为你厌恶你自己做一个自由又自律的人&#xff0c;靠势必实现的决心认真的活著我生活在妙不可言的等待…

C++中int、string等常见类型转换

1、int型与string型的互相转换 最佳实践&#xff1a; int型转string型 void int2str(const int &int_temp,string &string_temp) { stringstream stream; stream<<int_temp; string_tempstream.str(); //此处也可以用 stream>&…

SpringOne大会上发布了一个实验性的反应式关系型数据库连接驱动R2DBC

在SpringOne平台华盛顿大会上宣布的R2DBC是一个从头开始设计的实验性API&#xff0c;用于针对关系型数据库进行反应式编程。最终目标是试图影响ADBA规范。\\在活动中&#xff0c;Cloud Foundry Java Experience团队负责人Ben Hale表示&#xff0c;R2DBC的设计原则是基于以下四个…

浅谈px,em和rem这些单位的区别

px,em,rem三个单位在前端中十分常见&#xff0c;但是很多时候刚刚接触会觉得不明觉厉&#xff0c;今天恰巧学到这些&#xff0c;留下一些自己的对这些单位的理解。 1、单位px     px是相对长度单位&#xff0c;是相对屏幕分辨率而言的&#xff0c;简单地说就是1px等价于1分…

sklearn中的朴素贝叶斯

1 概述 1.1 真正的概率分类器 在许多分类算法应用中&#xff0c;特征和标签之间的关系并非是决定性的。如想预测一个人究竟是否能在泰坦尼克号海难中生存下来&#xff0c;可以建一棵决策树来学习训练集。在训练中&#xff0c;其中一个人的特征为30岁、男、普通舱&#xff0c;…

RT如何生成image

目录 生成Normal image生成signed image生成encrypted image上一篇文章我们介绍了RT的boot流程&#xff0c;今天来介绍下RT如何生成image。生成的image有如下三种类型&#xff1a; Normal imageSigned imageEncrypted image生成Normal image 如果芯片secure boot不开启的话&…

HDU 5992 Finding Hotels(KD树)题解

题意&#xff1a;n家旅店&#xff0c;每个旅店都有坐标x&#xff0c;y&#xff0c;每晚价钱z&#xff0c;m个客人&#xff0c;坐标x&#xff0c;y&#xff0c;钱c&#xff0c;问你每个客人最近且能住进去&#xff08;非花最少钱&#xff09;的旅店&#xff0c;一样近的选排名靠…

win10开移动热点让手机使用上网

PC得买个无线网卡带尾部那种的&#xff0c;插后面&#xff0c;有了无线网卡能力了。 然后开启移动热点&#xff1a; 在设备管理器里面去&#xff0c;找到网络适配器&#xff0c;选择带有Wireless的那个&#xff0c;更新驱动&#xff0c;浏览计算机查找&#xff0c;从计算机的设…

LeetCode - 141. Linked List Cycle

Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it without using extra space? 经典问题&#xff0c;判断一个单向链表是否有环&#xff0c;快慢指针&#xff0c;有相遇即有环。 /*** Definition for singly-linked list.* class ListNod…

bzoj 1724 优先队列 切割木板

倒着的石子合并&#xff0c;注意不是取当前最长木板贪心做&#xff0c;而是取当前最小累加答案&#xff1b; 例如 4 5 6 7 若按第一种思路:ans22159 第二种&#xff1a;ans22139,可以先从中间某一块分开&#xff0c;这样答案更优 #include<bits/stdc.h> #define rep(i,x…
最新文章