Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Django4: Ajax AttributeError

I’m trying to create this Ajax request:
The views file is as follows:

reports/views.py

from django.shortcuts import render
from profiles.models import Profile
from django.http import JsonResponse
from .utils import get_report_image
from .models import Report
from .forms import ReportForm
# Create your views here.

def create_report_view(request):
    form = ReportForm(request.POST or None)
    if request.is_ajax():
        image = request.POST.get('image')
        name = request.POST.get('name')
        remarks = request.POST.get('remarks')
        img = get_report_image(image)
        author = Profile.objects.get(user=request.user)
        
        if form.is_valid():
            instance = form.save(commit=False)
            instance.image = img
            instance.author = author
            instance.save()
        #   Report.objects.create(name=name, remarks=remarks, image=img, author=author)
        
        return JsonResponse({'msg': 'send'})
    return JsonResponse({})

utils.py

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

import base64, uuid
from django.core.files.base import ContentFile

def get_report_image(data):
    _ , str_image = data.split(';base64')
    decoded_img = base64.b64decode(str_image)
    img_name = str(uuid.uuid4())[:10] + '.png'
    data = ContentFile(decoded_img, name=img_name)
    return data

urls.py

from django.urls import path
from .views import create_report_view

app_name = 'reports'

urlpatterns = [
    path('save/', create_report_view, name='create-report'),
]

forms.py

from django import forms
from .models import Report

class ReportForm(forms.ModelForm):
    class Meta:
        model = Report
        fields = ('name', 'remarks')

I’m not sure why but this is the error I’m getting. Does this mean that is_ajax() is no longer accepted with Django 4.1.1? If so how would I need to adjust the code?

if request.is_ajax():
AttributeError: 'WSGIRequest' object has no attribute 'is_ajax'
[21/Sep/2022 07:23:39] "POST /reports/save/ HTTP/1.1" 500 98007

>Solution :

here is a way to implement is_ajax to every request:

  1. create a middlewares.py in any of your app, in my case, common app. (it does not matter which app you add this in, middlewares are wrapper functions called globally to perform action before or after view).

class AjaxMiddleware:
def init(self, get_response):
self.get_response = get_response

    def __call__(self, request):
        def is_ajax(self):
            return request.META.get('HTTP_X_REQUESTED_WITH') == 
                   'XMLHttpRequest'
        
        request.is_ajax = is_ajax.__get__(request)
        response = self.get_response(request)
        return response

this will define a is_ajax method on every request before it is received by the view.

  1. plug this in settings.py:

    MIDDLEWARE = [
    ‘common.middleware.AjaxMiddleware’,
    ]

And this will solve your error.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading