Ajax POST на url с последующим перенаправлением на него
Я создаю веб-приложение, в котором пользователь может создавать маркеры на карте листовки. Детали маркера сохраняются в бэкенде с помощью Django. Моя цель - перенаправить пользователя на страницу детализации для заполнения подробностей маркера после нажатия на карту. Вот js код для перенаправления на url create с помощью Ajax post. Он запускается, когда пользователь нажимает на карту листовки.
map.on("click", function (e) {
window.location.href = {% url 'create' %};
$.ajax({
url: {% url 'create' %},
data: { markers: markers_dict},
type: "POST"
}).done(function (response) {
console.log(response);
});
}
но у меня возникают трудности в views.py, потому что этот редирект и AJAX пост создают два запроса один GET и другой POST:
def create_marker(request):
if request.method == "POST":
r = request.POST.get("markers")
print(r)
return JsonResponse({"response":"succeed"})
else:
return JsonResponse({"response":"failed"})
и urls.py :
url_patterns = [
path("create/",views.create_marker,name="create"),
]
Он всегда возвращает неудачный ответ, даже если печатает r
в консоли. Как я могу отправить эти данные фронтенда в create url, перенаправить на этот url и создать django с этими данными?
Вы выходите из текущей страницы перед выполнением вызова ajax. Переместите перенаправление в блок done вызова ajax. Что-то вроде этого:
map.on("click", function (e) {
$.ajax({
url: {% url 'create' %},
data: { markers: markers_dict},
type: "POST"
}).done(function (response) {
window.location.href = “{% url 'create' %}/” + response.id;
});
}
Вам понадобится еще один url в вашем urls.py для редактирования объекта маркера в бэкенде. Попробуйте использовать CBV DetailView.
Сначала вы публикуете в этом представлении данные вашей карты. После успеха перенаправьте пользователя в представление редактирования созданных данных.
- Пользователь нажимает на карту Вы создаете минимальный объект в бэкенде
- Вы получаете ID созданного объекта при успехе
- Перенаправляете пользователя на форму/представление редактирования этого объекта
- Пользователь заполняет оставшиеся элементы
- Пользователь нажимает на кнопку сохранения