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)
В новой версии 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'
И используйте этот метод везде, где захотите.