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

如何在Django Rest Framework中使用DELETE方法实现对象删除?

如何在DRF中用DELETE方法实现删除功能

HTML原生表单仅支持GET和POST两种请求方法,这是你直接用@api_view(['DELETE'])配合表单无法生效的核心原因。不过可以通过以下两种方案实现用DELETE方法完成删除操作:

方案一:表单模拟DELETE请求(利用DRF方法覆盖)

DRF支持通过请求参数_method或者请求头X-HTTP-Method-Override来覆盖实际的请求方法。你可以保持表单的method="post",但添加一个隐藏字段指定要使用的DELETE方法,同时修改视图接收DELETE请求:

修改后的视图代码

from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated
from rest_framework import status
from rest_framework.response import Response
from django.shortcuts import get_object_or_404, redirect
from .models import Article

@api_view(['DELETE'])
@permission_classes([IsAuthenticated])
def delete_article(request, article_id):
    article = get_object_or_404(Article, pk=article_id)
    if article.author == request.user:
        article.delete()
        # 前后端不分离场景返回重定向,前后端分离可改为JSON响应
        return redirect('/')
    return Response(status=status.HTTP_403_FORBIDDEN)

修改后的表单代码

<form action="{% url 'news:delete' article.id %}" method="post">
    {% csrf_token %}
    <!-- 添加隐藏字段指定要使用的DELETE方法 -->
    <input type="hidden" name="_method" value="DELETE">
    <input type="submit" value="delete">
</form>

注意:确保DRF配置中启用了django.middleware.http.HttpResponseRedirectMiddleware中间件(默认已启用),这样DRF才能识别_method参数并将POST请求转换为DELETE请求处理。

方案二:使用JavaScript发送AJAX DELETE请求

如果项目允许使用前端脚本,可以直接通过AJAX发送DELETE请求,无需依赖表单的POST模拟:

前端HTML(替换原表单)

<button class="delete-btn" data-article-id="{{ article.id }}">delete</button>
<!-- 页面中需保留CSRF令牌,通常base模板已包含 -->
{% csrf_token %}

JavaScript代码(Fetch API实现)

document.querySelectorAll('.delete-btn').forEach(btn => {
    btn.addEventListener('click', async function() {
        const articleId = this.dataset.articleId;
        const url = `/news/delete/${articleId}/`; // 替换为你的实际URL
        
        // 获取页面中的CSRF令牌
        const csrfToken = document.querySelector('[name=csrfmiddlewaretoken]').value;
        
        try {
            const response = await fetch(url, {
                method: 'DELETE',
                headers: {
                    'X-CSRFToken': csrfToken,
                    'Content-Type': 'application/json'
                }
            });
            
            if (response.ok) {
                // 删除成功后的操作,比如刷新页面或移除对应DOM元素
                window.location.href = '/';
            } else {
                alert('删除失败,请检查权限');
            }
        } catch (error) {
            console.error('请求出错:', error);
        }
    });
});

对应视图代码

和方案一中的视图代码一致,若为前后端分离场景,可返回JSON响应替代重定向:

return Response({"message": "删除成功"}, status=status.HTTP_200_OK)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 01:17:09