Почему не работает AJAX функция?
У меня есть класс class OrderCreate(CreateView)
, где я обрабатываю создание экземпляра модели Order. Я хочу, чтобы форма, представленная в этом классе обрабатывалась через AJAX. Ранее я уже работал с AJAX, реализовал корзину, отправки вопросов в администрацию сайта и все работает корректно, однако тут столкнулся с проблемой, что не срабатывает AJAX функция.
Полагаю, что проблема может быть вызвана двумя вещами:
Некорректно работает маршрутизация. Поясню. У меня форма для создания заказа представлена на странице making.html, которая в свою очередь доступна по ссылке
/order/order-create/
(ниже я приведу все паттерны). Обрабатываю AJAX запрос я не в классе представленииclass OrderCreate(CreateView)
, а в отдельной функцииdef check_bonuses(request)
. Соответственно, возможно, что в AJAX url, который я передаю, некорректно передается. Что я имею в виду:urls.py
(корневого приложения):urlpatterns = [ path("admin/", admin.site.urls), path('', include('main_application.urls')), path('users/', include('users.urls')), path('cart/', include('cart.urls')), path('order/', include('order.urls')), ] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urls.py
(приложенияorder
, где обрабатываются заказы):app_name = 'order' urlpatterns = [ path('order-pay/', OrderPay.as_view(), name='order-pay'), path('order-create/', OrderCreate.as_view(), name='order-create'), path('order-create/check-bonuses/', check_bonuses, name='check-bonuses'), ]
Когда я вручную ввожу путь order/order-create/check-bonuses/
, то функция check_bonuses
вызывается и работает корректно. Соответственно предполагаю, что ошибка либо в шаблоне в форме, либо я некорректно передаю url AJAX, в результате чего не срабатывает сам AJAX.
making.html
:
<form method="POST" id="orderForm">
{% csrf_token %}
<div class="delivery__row-input">
<label for="name" class="delivery__label">Списать бонусов:</label>
{{ form.current_bonuses }}
</div>
<input class="button delivery__button" type="submit" value="ПЕРЕЙТИ К ОПЛАТЕ">
</form>
Тут у меня у формы есть уникальный идентификатор, который передается в событие JQUERY.
ajax.js
:
$(function() {
$('#orderForm').on('submit', function(e){
e.preventDefault();
let input_data = $('#bonuses_formID').val()
$.ajax({
url: 'order/order-create/check-bonuses/',
type: 'POST',
data: {
input_data: input_data,
csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken]').val(),
},
success: function (response) {
if (response.success) {
$('#bonuses_formID').addClass('promocode_ok');
} else {
$('#bonuses_formID').addClass('promocode_error');
}
},
error: function(xhr, errmsg, err) {
console.log(xhr.status + ": " + xhr.responseText);
}
});
});
});
views.py
:
def check_bonuses(request):
print(f"\nAjax function!\n")
if request.method == 'POST':
profile = Profile.objects.get(user=request.user.id)
current_bonuses = int(profile.current_bonuses)
input_bonuses = int(request.POST.get('input_data'))
if input_bonuses > current_bonuses:
return JsonResponse({'success': False, 'message': 'Число запрошенных бонусов больше текущих!'})
else:
return JsonResponse({'success': True})
else:
return HttpResponse()
Испробовал все, не могу никак докопаться, в чем ошибка и почему не работает AJAX при отправке формы? e.preventDefault()
просто не срабатывает, страница перезагружается, в терминале высвечивается это:
"GET /order/order-create/?delivery=moscow&way=usual&csrfmiddlewaretoken=hX7mZs8TYZsZrgwTgHml79eAM0HUva5TouMRQoNb999EMx7eLkxfeygcdpPR3I50&city=%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0&index=105523&street=15-%D1%8F+%D0%BF%D0%B0%D1%80%D0%BA%D0%BE%D0%B2%D0%B0%D1%8F&corp=1&house=54&room=52&shipment_date=14.02.2024&promo=¤t_bonuses= HTTP/1.1" 200 30704
но, вместе с тем методы form_valid()
и form_invalid()
также не вызываются. Не могу разобраться, в чем проблема.