在Django中如何处理HTMX发送的PATCH请求并解决AttributeError报错
Django处理HTMX PATCH请求的解决方案
AttributeError: 'WSGIRequest' object has no attribute 'PATCH'报错的核心原因是Django原生HttpRequest对象仅封装了GET、POST两个表单数据属性,不会自动解析PATCH/PUT等请求的表单数据到同名属性中。
下面是两种常用的适配方案:
方案1:单视图手动解析(无额外配置,适合少量接口)
直接在patch方法内解析请求体的表单数据即可,修正后的视图代码如下:
from django.http import QueryDict from django.views.generic.base import View from django.http import HttpResponse class MyHtmxView(View): def patch(self, request, *args, **kwargs): # 解析PATCH请求的表单编码数据 patch_data = QueryDict(request.body) form = MyForm(patch_data) if form.is_valid(): form.save() # 无内容返回时用204状态码更符合规范,也适配你设置的hx-swap="none" return HttpResponse(status=204) else: return HttpResponse(self.form_invalid(form), status=400)
该方案无需修改全局配置,仅调整当前视图逻辑即可生效,你的前端HTMX代码不需要做任何改动。
方案2:全局中间件统一适配(适合大量使用非POST请求的场景)
如果项目中频繁使用HTMX发送PATCH/PUT/DELETE等请求,可以编写全局中间件自动解析对应请求的表单数据,后续所有视图都可以直接调用request.PATCH/request.PUT等属性,无需重复解析。
- 新建中间件文件
middleware.py:
from django.http import QueryDict class MethodFormDataParseMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): if request.method in ("PUT", "PATCH", "DELETE") \ and request.META.get("CONTENT_TYPE") == "application/x-www-form-urlencoded": # 将解析后的表单数据绑定到请求对象的对应方法属性上 setattr(request, request.method, QueryDict(request.body)) return self.get_response(request)
- 在
settings.py的MIDDLEWARE列表中注册中间件,放在CommonMiddleware之后即可:
MIDDLEWARE = [ # ... 原有默认中间件 "django.middleware.common.CommonMiddleware", "你的应用名.middleware.MethodFormDataParseMiddleware", # ... 其他中间件 ]
配置完成后,你原有视图中写的form = MyForm(request.PATCH)即可正常运行。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

