Django4: Ajax AttributeError

Я пытаюсь создать такой Ajax запрос: Файл views выглядит следующим образом:

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

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')

Я не уверен почему, но именно эту ошибку я получаю. Означает ли это, что is_ajax() больше не принимается в Django 4.1.1? Если да, то как мне нужно скорректировать код?

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

вот способ внедрения is_ajax в каждый запрос:

  1. создайте middlewares.py в любом из ваших приложений, в моем случае в common app. (не имеет значения, в каком приложении вы его добавите, middlewares - это функции-обертки, вызываемые глобально для выполнения действий до или после просмотра).
  2. .

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

это определит метод is_ajax для каждого запроса, прежде чем он будет получен представлением.

  1. вставьте это в settings.py:

    MIDDLEWARE = [ 'common.middleware.AjaxMiddleware', ]

И это решит вашу ошибку.

Ок, кажется, теперь работает. request.is_ajax устарел с версии django 3.1 и был удален с версии django 4

if request.headers.get('x-requested-with') == 'XMLHttpRequest': 

вместо

if request.is_ajax:
Вернуться на верх