Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you handle a PATCH request from HTMX in Django?

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?

like image 656
Ben Avatar asked Dec 06 '21 09:12

Ben


People also ask

How does Django process a request?

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.

What is HTTP response in Django?

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.


2 Answers

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))
like image 134
Anurag Regmi Avatar answered Oct 19 '22 20:10

Anurag Regmi


From the docs, your form info will be in the request.POST attribute. You can check for PATCHs with if request.method == "PATCH".

like image 3
Lllama Avatar answered Oct 19 '22 20:10

Lllama