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 в каждый запрос:
- создайте middlewares.py в любом из ваших приложений, в моем случае в common app. (не имеет значения, в каком приложении вы его добавите, middlewares - это функции-обертки, вызываемые глобально для выполнения действий до или после просмотра). .
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 для каждого запроса, прежде чем он будет получен представлением.
вставьте это в 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: