I would like to send a PATCH request to my app but I'm not sure how to consume the request in Django. I am currently getting the following error.
AttributeError: 'WSGIRequest' object has no attribute 'PATCH'
The input field in the HTMX file looks like this (I also made sure to send the CSRF token):
<input
name="myfield"
hx-patch="{% url 'my_update' myobj.id %}"
hx-swap="none" />
This is the Django View
class MyHtmxView(View):
def patch(self, request, *args, **kwargs):
form = MyForm(request.PATCH)
if form.is_valid():
form.save()
# return an okay status? 200?
else:
return HttpResponse(self.form_invalid(form))
Django is receiving the request, but isn't sure what to do with request.PATCH. I can see in the Django docs that there is a HttpRequest.GET and HttpRequest.POST but no HttpRequest.PATCH https://docs.djangoproject.com/en/3.2/ref/request-response/#httprequest-objects. What's the best way to handle the PATCH?
Django uses request and response objects to pass state through the system. When a page is requested, Django creates an HttpRequest object that contains metadata about the request. Then Django loads the appropriate view, passing the HttpRequest as the first argument to the view function.
HttpResponse (source code) provides an inbound HTTP request to a Django web application with a text response. This class is most frequently used as a return object from a Django view.
You need to parse the request body manually which can be accessed via request.body
and parse using QueryDict(request.body)
from django.http.request import QueryDict
class MyHtmxView(View):
def patch(self, request, *args, **kwargs):
# parse request body mannualy
data = QueryDict(request.body)
form = MyForm(data)
if form.is_valid():
form.save()
# return an okay status? 200?
else:
return HttpResponse(self.form_invalid(form))
From the docs, your form info will be in the request.POST
attribute. You can check for PATCH
s with if request.method == "PATCH"
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With