AttributeError at /Customer/Visit 'WSGIRequest' object has no attribute 'is_ajax' in django

Пожалуйста, помогите мне Я пытаюсь изучить ajax в django, но когда я запускаю этот простой тест, я получаю эту ошибку и не могу найти причину, моя версия django - 4.0

ошибка

AttributeError at /Customer/Visit

У объекта 'WSGIRequest' нет атрибута 'is_ajax'

Вот код моего js файла:

enter code here
const alertBox = document.getElementById('alert-box')
const imagebox = document.getElementById('image-box')
const form = document.getElementById('visit-form')

const customer = document.getElementById('id_Customer')
const visit_date = document.getElementById('id_Visit_date')
const price = document.getElementById('id_Price')
const pic = document.getElementById('id_Pic')

const csrf = document.getElementsByName('csrfmiddlewaretoken')

const url = ''

const handelAlert = (type, text) => {
    alertBox.innerHTML = '<div class="alert alert-"' + type + '"> ' + text + ' </div>'
}

pic.addEventListener('change', () => {
    const image_data = pic.files[0]
       const url = URL.createObjectURL(image_data)
       console.log(url)
           imagebox.innerHTML = '<img src="' + url + '" width="50%" >'
})

form.addEventListener('submit', e => {
    e.preventDefault()

const fd = new FormData()
fd.append('csrfmiddlewaretoken', csrf[0].value)
fd.append('customer', customer.value)
fd.append('visit_date', visit_date.value)
fd.append('price', price.value)
fd.append('pic', pic.files[0])
alert('df')
$.ajax({
    type: "POST",
    url: url,
    enctype: 'multipart/form-data',
    data: fd,
    success: function(response) {
        console.log(response)
        const sText = 'ثبت ' + response.visit_date + 'با موفقیت انجام شد'
        handelAlert('success', sText)
        setTimeout(() => {
            alertBox.innerHTML = ""
            imagebox.innerHTML = ""
            customer.value = ""
            visit_date.value = ""
            price.value = ""
            pic.value = ""
        }, 2000)
    },
    error: function(error) {
        console.log(error)
        handelAlert('danger', 'خطا در ثبت')
    },
    cache: false,
    contentType: false,
    processType: false,
})

})
console.log(form)

Вот код моего Html файла:

<div class="box-body">
        <div id="alert-box"></div>

        <form id="visit-form" autocomplete="off">
            {% csrf_token %} {{ form|crispy }}

            <button type="submit" class="btn btn-success"> ثبت ویزیت </button>

        </form>
        <div id="image-box"></div>
    </div>

Вот код моего файла View.py:

def Visit(request):
    list_visit = VisitModel.objects.all()
    form = VisitForm(request.POST or None, request.FILES or None)
    data = {}
    if request.is_ajax():
        if form.is_valid():
            form.save()
    data['name'] = form.cleaned_data.get('name')
        data['status'] = 'ok'
        return HttpResponse(data)
context = {
    'form': form,
    'list_visit':list_visit
}
return render(request, 'customer/visit.html', context)

views

В новой версии django is_ajax был удален. Вы можете сделать это самостоятельно, используя, например, такой код:


def is_ajax(request):
    if request.META.get("HTTP_X_REQUESTED_WITH") == "XMLHttpRequest":
        return True

    if request.content_type == "application/json":
        return True
    return False
Метод

HttpRequest.is_ajax() устарел с версии Django 3.1 и также удален в Django 4.0 как документированный

Вместо этого вы можете проверить заголовок Accept в соответствии с очисткой ticket

Если вы все еще хотите повторить функциональность старого метода, вы можете сделать свою собственную базу на source

def is_ajax(request):
    return request.headers.get('x-requested-with') == 'XMLHttpRequest'

Какую версию Django вы используете?

Из примечания к выпуску 3.1

Метод HttpRequest.is_ajax() устарел, так как он полагался на специфический для jQuery способ определения AJAX-вызовов, в то время как в настоящее время используется JavaScript Fetch API. В зависимости от вашего случая использования, вы можете либо написать свой собственный метод определения AJAX, либо использовать новый метод HttpRequest.accepts(), если ваш код зависит от HTTP-заголовка Accept клиента

.

Если вы хотите написать свой собственный AJAX метод обнаружения, то вы можете проверить запрос как

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

Если вы пишете свой собственный метод определения AJAX, request.is_ajax() можно воспроизвести точно так же, как request.headers.get('x-requested-with') == 'XMLHttpRequest'

Так что вы можете создавать свои пользовательские method как

def is_ajax(request):
    return request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest'

И используйте этот метод везде, где захотите.

Вернуться на верх