Маршрут Django не может быть доступен в методе fetch POST, но может быть доступен в методе manual GET
Когда я пытаюсь удалить фракцию из своего приложения с помощью маршрута saga/delete/2 после нажатия кнопки deleteSubmit, программа возвращает следующую ошибку: "POST /saga/delete/2/ HTTP/1.1" 404 3048 Не найдено: /saga/delete/2/
Мое приложение использует следующие соответствующие шаблоны url
saga/ edit/<int:factionId> [name='edit']
saga/ delete/<int:factionId> [name='delete']
Этот JavaScript обрабатывает отправку формы
factionForm.addEventListener('submit', function(event) {
//prevent the default form submission
event.preventDefault();
//If the Save Changes button is clicked
if (event.submitter === saveSubmit){
console.log("Save Changes Pressed");
// Code to handle form submission and save changes to the database
}
//Otherwise if the Delete changes button is clicked
else if(event.submitter === deleteSubmit){
console.log("Delete Faction Pressed");
//Attempt to send data to server
fetch(`/saga/delete/${factionId.value}/`, {
method: 'POST',
headers: {
'X-CSRFToken': getCSRF(),
},
})
//Get response from server
.then(response => {
if (response.ok) {
console.log('Faction deleted successfully');
} else {
//If a problem occurred display the response
console.error('Error deleting faction',response);
}
})
//If There is an error output it
.catch(error => {
console.error('Error:', error);
});
}
//Otherwise if neither approved button submitted the form something went wrong
else {
console.log(event.submitter, "somehow submitted the form, check and correct the code near that element");
}
})
Код, который я использую для функции getCSRF(), находится здесь:
function getCSRF() {
const cookies = document.cookie.split('; ');
for (let i = 0; i < cookies.length; i++) {
const [name, value] = cookies[i].split('=');
if (name === "csrfToken") {
return decodeURIComponent(value);
}
}
return null;
}
Здесь также находится соответствующая функция просмотра
def delete(request,factionId):
#Get Faction To Delete
faction = Faction.objects.filter(id = factionId)
#If Faction Exists and Data has been posted from a form
if faction.count() > 0 and request.method == 'POST':
#Delete the faction
faction.delete()
#Return to create page on success (Will change to success message later)
return redirect(reverse("saga:create"))
#Return to home page on failure (happens currently during a Get request
return redirect(reverse("saga:index"))
Моя форма была определена следующим образом:
<form id = "factionForm" method = "post">
{% csrf_token %}
<!-- Lots of Code -->
</form>
Что я упустил и как мне изменить код, чтобы мой POST был принят?
Я пытался удалить csrf_token и использовать декоратор @csrf_exempt безрезультатно.
Я пытался использовать различные функции для получения csrf_token, но, насколько я могу судить, моя текущая функция получает токен.
Я проверил файл settings.py, чтобы убедиться, что 'django.middleware.csrf.CsrfViewMiddleware' присутствует, и он присутствует.
Я пытался изменить шаблоны url, но безуспешно.
Возможно, проблема заключается в этом:
fetch(`/saga/delete/${factionId.value}/.....
обратите внимание на косую черту в конце. Но в вашем urls.py:
path("delete/<int:factionId>", views.delete, name = 'delete')
у вас нет слэша в конце строки. Я думаю, что проблема может заключаться в том, что у вас должен быть слэш в конце строки. Попробуйте убрать или добавить косую черту в обе вышеприведенные строки кода и посмотрите, работает ли это.