如何在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
相关产品推荐
相关产品推荐

