Как отправить django url с параметрами в ajax запрос?
В настоящее время я отправляю url в ajax как :
$('.togglebtn').on("click",function(){
console.log("Hello")
$.ajax({
type: 'GET',
url: "http://localhost:8000/toggle/2945016571198",
contentType: 'application/json',
success: function (data) {
appendData(data);
function appendData(data) {
var mainContainer = document.getElementById("switch_{{forloop.counter}}");
for (var i = 0; i < data.length; i++) {
var div = document.createElement("div");
div.innerHTML = '<tr>' + data[i].line_items + ' ' + data[i].nomenclature+'</tr>' ;
mainContainer.appendChild(div);
}
}
}
});
В настоящее время я посылаю запрос в статический url. Можно ли использовать {% url toggle
i.id %} для динамической установки url в ajax-запросе? Повторяется ли эта ajax-функция вообще или нет?
Не таким образом или способом, {% url toggle i.id %}
предназначен для шаблона Django, поэтому он выполняется при рендеринге страницы на стороне сервера. То, что вы хотите сделать, выполняется на стороне клиента.
Вы также пытаетесь использовать "switch_{{forloop.counter}}"
, что не сработает, если у вас нет нескольких фрагментов функции 'click'. Что я бы не советовал делать, поскольку это просто не имеет смысла. Вы определяете функцию один раз, а затем используете ее. Смотрите первый пример
Лучшее, что я могу придумать, это раскрытие 'базового url' в вашем шаблоне и использование его в javascript. Например, в вашем шаблоне Django:
<script>
// Put the Django variable into javascript context.
toggle_base_url = {{ toggle_base_url_from_django_view_context }};
// Use it in your ajax url by combining strings.
$('.togglebtn').on("click",function(){
console.log("Hello")
var obj = $(this); // Save the clicked button for reference.
var objectId = obj.attr('id');
var buttonId = obj.attr('data-button-id');
$.ajax({
type: 'GET',
url: toggle_base_url + "/" + buttonId
contentType: 'application/json',
success: function (data) {
// Cannot use 'this' in this context (IIRC), use the obj var we assigned.
// Replace with something to find your parent container
// Could use have a attribute on your button that points to the container.
// Probably the number you use in the url?
var mainContainer = obj.parent('containerclass');
for (var i = 0; i < data.length; i++) {
var div = document.createElement("div");
div.innerHTML = '<tr>' + data[i].line_items + ' ' + data[i].nomenclature+'</tr>' ;
mainContainer.appendChild(div);
}
}
}
});
</script>
В вашем представлении Django вы делаете что-то вроде этого:
# Make a base url to reuse, remove the last part.
# So turn `/toggle/1` into `/toggle`
base_url = reverse('toggle', args=[1]).rsplit('/', 1)
context = {
'toggle_base_url_from_django_view_context': base_url,
}
return render(request, 'yourtemplate.html', context=context)