You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django开发:如何为用户故事卡片列表添加带确认的删除功能

没问题,我来帮你搞定这个删除卡片的功能!分后端和前端两部分来实现,步骤很清晰,而且能满足带确认对话框的需求~

实现步骤详解

一、后端:添加删除视图与URL路由

首先我们需要在Django里处理删除卡片的逻辑,有两种常用方式,选你习惯的就行:

方式1:使用类视图(推荐,Django自带的DeleteView很省心)

在你的views.py里添加:

from django.views.generic.edit import DeleteView
from django.urls import reverse_lazy
from .models import Card  # 替换成你的卡片模型类

class CardDeleteView(DeleteView):
    model = Card
    success_url = reverse_lazy('board')  # 替换成你的看板页面的URL名称,删除后跳回这里
    
    # 可选但重要:限制用户只能删除自己创建的卡片(如果你的模型有user字段)
    def get_queryset(self):
        return super().get_queryset().filter(user=self.request.user)

方式2:使用函数视图

如果更习惯手写逻辑,也可以用函数视图:

from django.shortcuts import get_object_or_404, redirect
from .models import Card

def delete_card(request, pk):
    # 找到要删除的卡片,找不到就返回404
    card = get_object_or_404(Card, pk=pk)
    
    # 权限校验:只有卡片所有者才能删除
    if card.user != request.user:
        # 这里可以返回错误提示或者直接跳回看板
        return redirect('board')
    
    # 只处理POST请求,避免GET请求误删
    if request.method == 'POST':
        card.delete()
        return redirect('board')
    # 如果是GET请求,直接跳回看板
    return redirect('board')

然后在urls.py里配置路由:

from django.urls import path
from .views import board_view, CardDeleteView  # 替换成你的看板视图和删除视图

urlpatterns = [
    path('board/', board_view, name='board'),
    # 类视图的路由
    path('card/<int:pk>/delete/', CardDeleteView.as_view(), name='card_delete'),
    # 如果用函数视图,就换成下面这行
    # path('card/<int:pk>/delete/', delete_card, name='card_delete'),
]

二、前端:添加删除链接与确认对话框

接下来在看板页面的模板里,给每个卡片加上删除交互,这里有两种简单的实现方式:

方式1:用表单实现(最简单,无需额外JS)

直接在每个卡片的HTML结构里加一个小表单,通过onsubmit事件触发确认对话框:

{% for card in cards %}
<div class="card-item">  <!-- 替换成你的卡片容器类 -->
    <h3>{{ card.title }}</h3>
    <p>{{ card.description }}</p>
    
    <!-- 删除表单 -->
    <form action="{% url 'card_delete' card.pk %}" method="POST" onsubmit="return confirm('确定要删除这张卡片吗?');">
        {% csrf_token %}
        <button type="submit" style="color: red;">删除卡片</button>
    </form>
</div>
{% endfor %}

用户点击删除按钮时,会弹出浏览器原生的确认框,点击“确定”才会提交表单删除卡片,点击“取消”就中止操作。

方式2:用链接样式的按钮(更美观,需要一点JS)

如果想让删除按钮看起来像普通链接,可以用JS来发送POST请求,同时带上CSRF令牌:

{% for card in cards %}
<div class="card-item">
    <h3>{{ card.title }}</h3>
    <p>{{ card.description }}</p>
    
    <!-- 删除链接 -->
    <a href="#" class="delete-card-link" data-delete-url="{% url 'card_delete' card.pk %}">删除卡片</a>
</div>
{% endfor %}

<!-- 在页面底部添加JS代码 -->
<script>
document.addEventListener('DOMContentLoaded', function() {
    // 获取所有删除链接
    const deleteLinks = document.querySelectorAll('.delete-card-link');
    
    deleteLinks.forEach(link => {
        link.addEventListener('click', function(e) {
            e.preventDefault();  // 阻止默认的跳转行为
            const deleteUrl = this.getAttribute('data-delete-url');
            
            // 弹出确认对话框
            if (confirm('确定要删除这张卡片吗?')) {
                // 创建一个临时表单来发送POST请求(Django要求POST必须带CSRF令牌)
                const form = document.createElement('form');
                form.method = 'POST';
                form.action = deleteUrl;
                
                // 添加CSRF令牌
                const csrfToken = document.querySelector('[name=csrfmiddlewaretoken]').value;
                const csrfInput = document.createElement('input');
                csrfInput.type = 'hidden';
                csrfInput.name = 'csrfmiddlewaretoken';
                csrfInput.value = csrfToken;
                form.appendChild(csrfInput);
                
                // 提交表单
                document.body.appendChild(form);
                form.submit();
            }
        });
    });
});
</script>

注意:确保你的模板里已经有CSRF令牌(通常在base模板里会加{% csrf_token %},或者在页面的任意位置添加这个标签即可)。

三、额外提示:权限控制

一定要记得在视图里加上权限校验(比如前面代码里的filter(user=self.request.user)或者if card.user != request.user),不然任何用户都能删除别人的卡片,这是安全隐患哦!

内容的提问来源于stack exchange,提问作者Lylio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:49:29