Не удается запустить функцию Django из html-шаблона с помощью ajax
Я пытаюсь запустить функцию Django после события клика от пользователя с помощью Ajax внутри JS кода в HTML файле шаблона Django.
блок javascript
kml_layer.addListener('click', (kmlEvent) => {
setMapOnAll(null);
var clickedPoint = kmlEvent.latLng;
newPoint.postMessage(clickedPoint.lat() + "," + clickedPoint.lng())
console.log("layer id is " + "{{ single_layer.id }}");
runKmOnSource("{{ single_layer.id }}", kmlEvent); //Here is where I called the ajax jquery function
});
Аякс вызов
function runKmOnSource(theID,kmlEvent,){
console.log("started ajax")
$(document).ready(function () {
$.ajax({
type: "POST",
url: "{% url 'get_km_from_source' %}",
data: {
csrfmiddlewaretoken: '{{ csrf_token }}',
layer_id: theID,
the_element_string_id: kmlEvent.featureData.id,
clicked_lat: kmlEvent.latLng.lat,
clicked_lng: kmlEvent.latLng.lng
}, /* Passing the text data */
success: function (response) {
console.log("ajax success");
kmOnSource.postMessage(response)
}
});
});
}
urls.py
path('get_km_from_source/', get_km_from_source, name='get_km_from_source'),
и наконец Django/python view
def get_km_from_source(request):
"""
A function that takes data from the ajax function
parsing it then ending back the result
"""
print("xxxxxxxxxxxxxxxxsssssssssss started kmonsource") #This line to test if function executed
layer_id = request.POST['layer_id']
the_element_string_id = request.POST['the_element_string_id']
clicked_lat = request.POST['clicked_lat']
clicked_lng = request.POST['clicked_lng']
layer_object = models.MapLayers.objects.get(id=layer_id)
print(f"layer object is {layer_object}")
water_element_object = None
nearest_cord = None
first_cord = None
last_cord = None
for water_element in layer_object.waterelement_set.all():
if water_element.id_string == the_element_string_id:
water_element_object = water_element
break
for single_cord in water_element_object.cordsforwaterelement_set.all():
if nearest_cord is None:
nearest_cord = single_cord
else:
cord_dist = calc_dist(clicked_lat, clicked_lng, single_cord.latlng.split(",")[
0], single_cord.latlng.split(",")[1])
nearest_cord_dist = calc_dist(clicked_lat, clicked_lng, nearest_cord.latlng.split(
",")[0], nearest_cord.latlng.split(",")[1])
if cord_dist < nearest_cord_dist:
nearest_cord = single_cord
first_cord = water_element_object.cordsforwaterelement_set.filter(index=0)[
0]
last_cord = water_element_object.cordsforwaterelement_set.filter(index=nearest_cord.index - 1) if is_between(
f"{clicked_lat},{clicked_lng}", f"{first_cord.latlng}", f"{nearest_cord.latlng}") else nearest_cord
loop_index = 0
total_dist = 0
while loop_index < last_cord.index:
one_obj = water_element_object.cordsforwaterelement_set.filter(index=loop_index)[
0]
two_obj = water_element_object.cordsforwaterelement_set.filter(
index=loop_index + 1)[0]
total_dist += calc_dist(one_obj.latlng.split(",")[0], one_obj.latlng.split(
",")[1], two_obj.latlng.split(",")[0], two_obj.latlng.split(",")[1])
loop_index += 1
total_dist += calc_dist(last_cord.latlng.split(",")[0], last_cord.latlng.split(",")[
1], clicked_lat, clicked_lng)
return HttpResponse(f"{total_dist}", status=201)
здесь представление Python никогда не выполняется при попытке вызвать функцию в JS-коде.