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

Django:点击按钮时如何删除模型数据?

实现点击按钮删除对应Donation数据的方案

我来帮你搞定这个问题!要实现点击Accept按钮删除对应{{donation.pk}}的Donation模型数据,咱们可以分后端和前端两步来做,这里提供两种常用方案,你可以根据需求选择:

方案一:无刷新AJAX方式(推荐,用户体验更好)

这种方式点击按钮后页面不会刷新,直接在后台完成删除操作,还能即时更新页面内容。

1. 后端编写删除视图(views.py)

首先在你的app的views.py里添加一个处理删除请求的视图,注意要处理POST请求(GET请求做删除操作有安全风险):

from django.http import JsonResponse
from django.shortcuts import get_object_or_404
from .models import Donation
from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def delete_donation(request):
    if request.method == 'POST':
        # 获取前端传来的捐赠pk
        donation_pk = request.POST.get('pk')
        # 找到对应的捐赠记录,不存在则返回404
        donation = get_object_or_404(Donation, pk=donation_pk)
        # 删除记录
        donation.delete()
        # 返回成功响应
        return JsonResponse({'status': 'success'})
    # 如果不是POST请求,返回错误响应
    return JsonResponse({'status': 'error'}, status=400)

2. 配置路由(urls.py)

在项目或app的urls.py里添加对应的路由,让请求能映射到上面的视图:

from django.urls import path
from . import views

urlpatterns = [
    # 你的其他路由...
    path('delete-donation/', views.delete_donation, name='delete_donation'),
]

3. 前端修改按钮并添加JS逻辑

把原来的<a>标签改成按钮(或者保留<a>但阻止默认跳转),绑定点击事件发送AJAX请求:

<!-- 替换原来的a标签为这个按钮,用data-pk存储捐赠的pk -->
<button style="float:right; margin:5px; color: white;" class="btn btn-success delete-donation-btn" data-pk="{{ donation.pk }}">Accept</button>

<!-- 确保页面里有csrf token(Django要求POST请求必须带这个) -->
{% csrf_token %}

<!-- 用原生JS实现AJAX(不需要jQuery) -->
<script>
document.addEventListener('DOMContentLoaded', function() {
    // 获取所有删除按钮
    const deleteButtons = document.querySelectorAll('.delete-donation-btn');
    
    deleteButtons.forEach(button => {
        button.addEventListener('click', function() {
            const pk = this.dataset.pk;
            const csrfToken = document.querySelector('input[name="csrfmiddlewaretoken"]').value;
            
            // 发送POST请求
            fetch("{% url 'delete_donation' %}", {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded',
                    'X-CSRFToken': csrfToken
                },
                body: `pk=${pk}`
            })
            .then(response => response.json())
            .then(data => {
                if (data.status === 'success') {
                    // 删除成功后,把对应的捐赠条目从页面移除(假设你的捐赠项有父元素类donation-item)
                    this.closest('.donation-item').remove();
                    alert('捐赠已接受并成功删除!');
                } else {
                    alert('删除捐赠失败,请重试。');
                }
            })
            .catch(error => {
                console.error('删除出错:', error);
                alert('删除过程中出现错误,请稍后再试。');
            });
        });
    });
});
</script>

方案二:表单提交方式(简单易实现,页面会刷新)

如果不需要无刷新体验,用表单提交更简单,不需要写JS:

<!-- 把按钮放在一个表单里,隐藏存储pk,提交到删除路由 -->
<form action="{% url 'delete_donation' %}" method="POST" style="display:inline;">
    {% csrf_token %}
    <input type="hidden" name="pk" value="{{ donation.pk }}">
    <button type="submit" style="float:right; margin:5px; color: white;" class="btn btn-success">Accept</button>
</form>

然后修改后端视图,删除后重定向到你的捐赠列表页面:

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

def delete_donation(request):
    if request.method == 'POST':
        donation_pk = request.POST.get('pk')
        donation = get_object_or_404(Donation, pk=donation_pk)
        donation.delete()
        # 替换成你的捐赠列表页面的路由名称
        return redirect('donation_list')
    # 非法请求重定向到列表页
    return redirect('donation_list')

注意事项

  • 一定要带上{% csrf_token %},否则Django会拒绝POST请求(这是Django的安全机制)。
  • 如果用AJAX方式,确保{% url 'delete_donation' %}能正确生成路由URL,不要写错路由名称。
  • 可以根据实际情况调整成功后的提示或页面更新逻辑,比如移除对应的DOM元素、显示成功消息等。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 23:12:42