DjangoBlog|12 博客文章删除功能(优化版)

简介: DjangoBlog|12 博客文章删除功能(优化版)

简说Python,号主老表,Python终身学习者,数据分析爱好者,从18年开始分享Python知识,原创文章227篇,写过Python、SQL、Excel入门文章,也写过Web开发、数据分析文章,老表还总结整理了一份2022Python学习资料和电子书资源,关注后私信回复:2022 即可领取。

一、前情回顾

在前面,我们完成了Django Blog博客删除博客功能实现,这一节我们讲下如何优化博客删除功能。

Django Blog系列文章

Django Blog|01 创建环境和项目

Django Blog|02 创建admin账户&settings.py介绍

Django Blog|03 创建一个blog app和Article模型

Django Blog|04 创建blog视图和完成MVT框架开发

Django Blog|05 修改首页显示博客列表

Django Blog|06 添加博客详情页视图,显示博客详情

Django Blog|07 引入Bootstrap前端框架,优化页面

Django Blog|08 添加编写+发布博客功能

Django Blog | 09 这么简单!实现博客markdown输入和显示

Django Blog | 10 自定义Form,美化页面并实现文章编辑功能

Django Blog | 11 添加Django博客删除功能(基础版)

二、博客文章删除功能前端优化

上一篇我们是直接新建了一个博客删除页面,然后操作对文章的删除,但就文章删除这个功能来说,其实是没有必要再额外新建一个页面的。

那么首先我们来想想我们之前为什么要那样设计删除功能?就我个人有两点原因:

1、我知道这样操作肯定能实现功能,图简单;

2、删除博客,确实需要一个中转页面让用户考虑(避免误操作)。

我们不考虑个人能力问题,我们将原因合并:删除前需要提示用户正在进行删除操作,那这样想,更好的解决方法是,出一个弹框即可,就是当用户点击文章详情页上的删除按钮时,先弹出一个弹框提示用户是否要删除对应文章,然后用户选择删除,就直接删除文章,然后返回到博客首页。

如果不知道怎么实现,我们直接浏览器搜索bootstrap 弹框即可。

image.png

在Bootstrap官网教程的Components中有一个Modal,就表示的动态弹框,我们选择Live demo,复制好里面的内容。

image.png

删除按钮之前写在文章详情页面,所以我们现在打开Project/brief_blog/myblog/templates/article_detial.html,修改下删除按钮,主要要修改的就是这一段代码:

<a href="{% url 'delete_article' article.pk %}" style="text-decoration:none;font-size: 12px;text-align: right;float:right;color: rgb(93, 89, 89)">
            删除&nbsp;&nbsp;
</a>

替换成Bootstrap的弹框模块Live demo,直接先上修改好的代码(将下面代码替换掉上面代码即可):

<!-- Button trigger modal -->
<a href="delete" data-bs-toggle="modal" data-bs-target="#exampleModal"
    style="text-decoration:none;font-size: 12px;text-align: right;float:right;color: rgb(93, 89, 89)">
    删除&nbsp;&nbsp;
</a>
<!-- Modal -->
<div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title" id="exampleModalLabel">确认删除</h5>
                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
            </div>
            <div class="modal-body">
                请问,确认删除文章<font color="red">《{{article.title}}》</font>吗?
            </div>
            <div class="modal-footer">
                <button class="btn btn-secondary mt-4 mb-4" data-bs-dismiss="modal">取消</button>
                <form method="POST" action="{% url 'delete_article' article.pk %}">
                    <!-- 添加csrf_token,防止黑客攻击,获取表单提交内容
                    csrf Cross Site Request Forgery)攻击 跨站请求伪造攻击
                    -->
                    {% csrf_token %}
                    <button class="btn btn-primary mt-4 mb-4" type="submit">删除</button>
                </form>
            </div>
        </div>
    </div>
</div>

Bootstrap的弹框模块Live demo主要分为两块:

modal触发器,就是点击这个按钮,就会出现弹框,里面比较重要的两个设置:

data-bs-toggle="modal",表示这个是一个modal类型的按钮/开关,

data-bs-target="#exampleModal",其中exampleModal为我们设置的Modal的id,用于指示这个按钮是对应哪个Modal。

modal主体内容,主要设置和结构:

class="modal fade"和id="exampleModal" 设置modal类型和modal的id,

modal弹框内有三部分:弹框标题(modal-header)、主体内容(modal-body)、底部内容(odal-footer),底部我们设置了两个按钮,一个是取消,一个是删除,其中删除操作是放在了Post表单里面,并设置了csrf验证。

前端页面我们修改好后,我们还需要改下DeleteArticleView视图,需要注释掉视图类中的template_name,现在我们利用弹框处理,就没必要设置额外的模板了。进入Project/brief_blog/myblog/blog/views.py,将DeleteArticleView中的template_name一行注释/删除掉。

# 删除博客
class DeleteArticleView(DeleteView):
    model = Article
    success_url = reverse_lazy('home')
    # template_name = 'article_detial.html'

这样我们就完成了删除博客功能的优化啦,从上一节的跳转页面删除,变成了弹框删除,效果如下:

image.png

删除博客弹框模式演示

踩坑

替换成Bootstrap的弹框模块Live demo后,点击删除按钮无法弹出弹框?

老规矩先说怎么解决,注释/删除掉/Project/brief_blog/myblog/templates/article_detial.html中的:

<!-- <script src="{% static 'mdeditor/js/lib/raphael.min.js' %}"></script> -->

这个问题困扰我很久,不断尝试才发现是这个脚本引起的问题,raphael.js是一个可以渲染可缩放矢量图形 (SVG) 的js库,这个被引入本来是django-mdeditor中渲染md内容用的,暂时不知道为什么会和Bootstrap的modal冲突,按上面修改就可以解决问题,也不影响md渲染(不用raphael.js渲染SVG的话)。

相关文章
|
6月前
|
人工智能 JavaScript Linux
OpenClaw从部署到上手实战指南:阿里云+本地部署、百炼API配置、首次任务实操全攻略
2026年,OpenClaw(Clawdbot)作为开源AI生产力工具的代表,凭借跨平台部署、灵活的任务执行能力,成为普通人提升效率、落地AI应用的核心工具。很多用户历经波折完成安装、解决报错、成功启动系统后,却会对着界面陷入迷茫——不知道下一步该做什么。其实问题的核心从不是“不会用”,而是“没有给工具一个明确的任务”。OpenClaw的价值从不是简单的问答,而是帮你完整完成一件事,而装好后的第一件事,从来不是啃文档、研究配置,而是立刻让它完成一个简单的小任务。
956 1
|
4月前
|
数据采集 机器学习/深度学习 自然语言处理
大模型应用:大模型时代的XGBoost:传统梯度提升树与大模型的协同应用.103
本文详解XGBoost与大模型融合方法:利用大模型提取文本等非结构化数据的语义Embedding,与XGBoost处理的结构化特征拼接建模,兼顾高精度、强可解释性与语义理解能力,显著提升预测性能。
553 2
|
4月前
|
JSON 供应链 API
企业级实战:1688 图搜接口(item_search_img / 拍立淘) 接入方法
1688图搜API(item_search_img/拍立淘)支持以图搜货,传入图片URL或Base64,返回同款/相似B2B商品(含offerId、价格、起批量等)。含官方入口、完整参数、签名规则、Python调用示例、接入步骤及避坑指南,开箱即用。
|
Kubernetes 供应链 安全
云原生环境下的容器安全与最佳实践
云原生时代,容器与 Kubernetes 成为企业应用核心基础设施,但安全挑战日益突出。本文探讨容器安全现状与对策,涵盖镜像安全、运行时防护、编排系统风险及供应链安全,提出最小权限、漏洞扫描、网络控制等最佳实践,并结合阿里云 ACK、ACR 等服务提供全链路解决方案,展望零信任、AI 安全与 DevSecOps 融合趋势。
580 5
|
存储 弹性计算 人工智能
阿里云学生“云工开物”优惠福利详解
“云工开物”是阿里云推出的高校计划,面向全国师生提供丰富云资源与优惠权益,助力科研、教学与学习实践。学生完成认证即可领取300元无门槛抵扣金,享受包年包月或按量付费云产品,如低价ECS实例、轻量服务器等,提升云计算技能,低成本、高效开展项目实践。
|
8月前
|
JavaScript 前端开发 开发者
JavaScript实战:探究数组循环截取的实现技巧
本文介绍如何使用JavaScript实现数组的循环截取功能,适用于视频列表轮播等场景。通过for循环和slice两种方法,每隔固定时间截取4个元素并循环滚动索引,保证无缝衔接。详细讲解实现思路、代码解析及两种方法的优劣对比,帮助开发者提升实际编码能力。
198 1
|
数据采集 人工智能 监控
MyEMS 开源能源管理系统后台配置指南 —— 网关管理模块详解
开源能源管控系统面向建筑、工厂等场景的开源能源管理系统,支持电、水、气等数据采集与智能分析,并提供光伏监控、储能管理等功能模块。系统具备完善的网关管理功能,包括网关查看、添加、编辑、删除及批量操作,助力用户高效实现全链路能源管理。
555 1
|
存储 Linux 内存技术
linux系统查看硬盘序列号
本文介绍在Linux系统中查看硬盘信息的三种方法:1) 使用`hdparm`工具,通过`sudo hdparm -i /dev/sda`获取硬盘序列号和型号;2) 使用`smartctl`工具,不仅可查序列号和型号,还能了解硬盘健康状态;3) 使用`lshw`命令显示存储设备拓扑信息。此外,提供通用技巧如用`lsblk`确认磁盘标识,及注意事项,例如管理员权限和云主机可能隐藏物理序列号等。
|
Ubuntu Shell
ubuntu卸载conda
ubuntu卸载conda
2375 1
|
自然语言处理 JavaScript 数据可视化
5个值得推荐的Vue后台管理框架
几个优秀好看的 Vue 后台管理框架,每个框架都有自己的特点和优势,开发者可以根据项目需求选择适合的框架。
1262 0