Я пытаюсь использовать запрос ajax с моей формой Django. У меня не было этой проблемы, прежде чем пытаться реализовать AJAX. Я думаю, что в моей Java есть какая-то ошибка, но я не уверен. Я прошел все уроки и прочитал каждый документ, который смог найти. Я не могу решить эту проблему.
Js и HTML
{% extends "app/layout.html" %}
{% load crispy_forms_tags %}
{% block javascript %}
<script>
// using jQuery
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie !== '')
{
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
var csrftoken = getCookie('csrftoken');
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
$("#id_Time").change(function () {
var form = $(this).closest("form");
$.ajax({
url: form.attr("data-validate=time-url"),
data: {
'time': time
},
dataType: 'json',
sucess: function (data) {
if (data.is_taken) {
alert("Sorry this time is not available")
}
}
});
</script>
{% endblock %}
{% block content %}
<div class="container">
<form method="post" data-validate-time-url="{% url 'validate_time' %}"
#{{%csrf_tonen%}} *this is where the csrf token was before ajax*
{{ form|crispy }}
<input type="submit" value="Add Reservation"/>
</form>
</div>
{% endblock %}
views.py
def Add_Reservation(request):
"""Renders the add reservation page."""
form = ReservationsForm(request.POST, request.FILES)
if request.method == "POST":
if form.is_valid():
form.save()
return HttpResponseRedirect('')
else:
form = ReservationsForm()
return render(request,'app/AddReservation.html',{'form': form})
from django.db.models import Sum
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_protect
@csrf_protect
def validate_time(request):
DATE= request.GET.get('Date')
psize_input= request.GET.get('psize')
tme= request.GET.get('Time')
data = {
'is_taken': Reservation.objects.filter(DATE,Time).annotate(Sum('psize')).filter(psize__sum__lte=15-psize_input)
}
if data['is_taken']:
data['error_message'] = 'This time slot is full, try another!'
return JsonResponse(data)
forms.py
SEASON=('2019',)
MONTHS = {
5:_('May'), 6:_('Jun'), 7:_('Jul'), 8:_('Aug'),
9:_('Sep'), 10:_('Oct')
}
class ReservationsForm(forms.ModelForm):
class Meta:
model = Reservation
fields = ('name', 'psize', 'Date', 'Time', 'location')
widgets = {'Date': SelectDateWidget(years=SEASON,months=MONTHS),}
Я хочу, чтобы форма взаимодействовала с пользователем, если пользователь выбирает время, когда резервирование недоступно. Я думал, что лучший способ сделать это - использовать запросы AJAX. Как я могу улучшить это и устранить ошибку 403?
Спасибо, что заглянули!