Javascript - Редактирование формы с помощью Fetch
Я пытаюсь отредактировать существующую форму на моем сайте и сохранить изменения с помощью Javascript (не требуя обновления страницы). Я также использую Django.
Пока что, когда пользователь нажимает "редактировать" на странице, появляется соответствующая форма, показывающая уже сохраненную там информацию. Но когда я нажимаю 'сохранить', я получаю ошибку 404. Проблема заключается в Javascript-функции edit_post. Я также не уверен, правильно ли я использовал stringify, я новичок в использовании Javascript в Django. Любая помощь будет принята с благодарностью.
function edit_handeler(element) {
id = element.getAttribute("data-id");
document.querySelector(`#post-edit-${id}`).style.display = "block";
document.querySelector(`#post-content-${id}`).style.display = "none";
// everything above this works and opens up the form for editing
edit_btn = document.querySelector(`#edit-btn-${id}`);
edit_btn.textContent = "Save";
edit_btn.setAttribute("class", "text-success edit");
if (edit_btn.textContent == "Save") {
edit_post(id, document.querySelector(`#post-edit-${id}`).value); //here
edit_btn.textContent = "Edit";
edit_btn.setAttribute("class", "text-primary edit");
}}
function edit_post(id, post) {
const body = document.querySelector(`#post-content-${id}`).value;
fetch("/edit_post/", {
method: "POST",
body: JSON.stringify({
body:body
})
}).then((res) => {
document.querySelector(`#post-content-${id}`).textContent = post;
document.querySelector(`#post-content-${id}`).style.display = "block";
document.querySelector(`#post-edit-${id}`).style.display = "none";
document.querySelector(`#post-edit-${id}`).value = post.trim();
});
}
Релевантный html - это внутри карточки, для самого поста в html-файле:
<span id="post-content-{{i.id}}" class="post">{{i.text}}</span> <br>
<textarea data-id="{{i.id}}" id="post-edit-{{i.id}}"
style="display:none;" class="form-control textarea" row="3">{{i.text}}</textarea>
<button class="btn-btn primary" data-id="{{i.id}}" id="edit-btn-{{i.id}}"
onclick="edit_handeler(this)" >Edit</button> <br><br>
views.py
def edit_post(request, pk):
post = Post.objects.get(id=pk)
form = PostForm(instance=post)
if request.method == "POST":
form = PostForm(request.POST, instance=post)
if form.is_valid():
form.save()
return JsonResponse({}, status=201) # this works to edit and save to db
else:
if request.method == "GET":
form = PostForm(instance=post)
form_for_post = {'form': PostForm()}
return render(request, "network/make_post.html", {
"post": post,
"form_for_post": form,
})
Предположим, что вы запускаете свой сервер django локально и получаете 404 ответ от запроса на выборку, тогда это означает, что путь url не существует. Либо ваш сервер django не работает, либо url, который вы передаете в запрос на выборку, неверен. Если /edit_post/
является вашей желаемой конечной точкой, попробуйте выполнить выборку с полным URL запроса сервера
Что-то вроде этого
http://localhost:8000/edit_post
Замените 8000 на любой порт, на котором работает ваш сервер.
Ваше тело фетча структурировано правильно.