Как отправить форму Django и вывести результат без перенаправления страницы?
Здравствуйте, как поживаете? Надеюсь, кто-нибудь сможет мне помочь!
Я прочитал кучу ответов здесь, на stack overflow, но ни один из них не сработал. У меня есть приложение, которое является "социальной сетью". В Divs собственных постов зарегистрированного пользователя есть кнопка "Edit", которая заменяет содержимое поста на Djago форму для редактирования содержимого пользователем. Логика работает, но я хочу, чтобы когда пользователь сохраняет изменения, сам div изменялся, без обновления страницы, как я могу это сделать?
Мой views.py:
@login_required
def edit_post(request, id):
# Query the post
try:
post = Post.objects.get(id=id)
except Post.DoesNotExist:
return HttpResponse("Error: The post does not exist.")
# Check if the user is the post's author.
if request.user.id != post.author.id:
return HttpResponse("Error: You can't edit this post.")
# If request method is POST, modify the post
if request.method == "POST":
form = editPostForm(request.POST, instance=post)
if form.is_valid():
form.save()
return render(request, "network/postDiv.html", {"post": functions.getPost(id)}, content_type='application/xml')
# If request method is GET: return the form
form = editPostForm(instance=post)
return render(request, "network/editPostForm.html", {"form": form, "id": id})
Мой urls.py:
urlpatterns = [
path("", views.index, name="index"),
path("following", views.following, name="following"),
path("login", views.login_view, name="login"),
path("logout", views.logout_view, name="logout"),
path("register", views.register, name="register"),
path("u/<str:username>",views.profile, name="profile"),
path("post/post-<int:id>",views.getPost, name="postDiv"),
path("post/post-<int:id>/edit", views.edit_post, name="editPost"),
]
Мой HTML:
<h1> All Posts </h1>
<div class="PostsDiv border rounded">
<form id="newPostForm" action="{% url 'index' %}" method="post">
{% csrf_token %}
{{ newPostForm.content.errors}}
<label for="postContent" class="form-label">New Post:</label>
{{ newPostForm.content }}
<input type="submit" value="Submit" class="btn btn-primary">
</form>
</div>
<div class="posts">
{% for post in page %}
<div class="PostsDiv border rounded" id="post-{{ post.id }}">
<p>{{ post.content }}</p>
<div class="row">
<div class="col-1">
<span><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-heart" viewBox="0 0 16 16">
<path d="m8 2.748-.717-.737C5.6.281 2.514.878 1.4 3.053c-.523 1.023-.641 2.5.314 4.385.92 1.815 2.834 3.989 6.286 6.357 3.452-2.368 5.365-4.542 6.286-6.357.955-1.886.838-3.362.314-4.385C13.486.878 10.4.28 8.717 2.01L8 2.748zM8 15C-7.333 4.868 3.279-3.04 7.824 1.143c.06.055.119.112.176.171a3.12 3.12 0 0 1 .176-.17C12.72-3.042 23.333 4.867 8 15z"/>
</svg> {{ post.likes }}</span>
</div>
<div class="col">
{% if post.author == user %}
<button class="btn btn-outline-secondary btn-sm editPostButton">Edit</button>
{% endif %}
</div>
<div class="col">
</div>
</div>
<footer class="blockquote-footer">
Posted by <cite title="Source Title"><a href="{% url 'profile' post.author %}">{{ post.author }}</a> </cite>in<cite tittle="Source Title"> {{ post.dateTime}}</cite>
</footer>
</div>
{% endfor %}
</div>
Мой JS:
document.addEventListener("DOMContentLoaded", function () {
// Add listeners to the "Edit Post" buttons
document.querySelectorAll(".editPostButton").forEach((button) =>
button.addEventListener("click", function () {
postDiv = button.parentElement.parentElement.parentElement;
postDivClone = postDiv.cloneNode(true);
showEditPostForm(postDivClone);
})
);
});
function showEditPostForm(postDiv) {
fetch(`/post/${postDiv.id}/edit`)
.then((response) => response.text())
.then((response) => {
div = document.querySelector(`#${postDiv.id}`);
div.innerHTML = response;
})
$('.editPostForm').submit(function() {
$.ajax({
data: $(this).serialize(),
type: $(this).attr('method'),
url: $(this).attr('action'),
success: function(response) {
$(`#${postDiv.id}`).html(response.text());
}
});
return false;
});
}
Форма:
class editPostForm(forms.ModelForm):
class Meta:
model = Post
fields = ['content']
widgets = {
'content': forms.Textarea(attrs={'class': 'form-control textarea'})
}
А моя модель:
class Post(models.Model):
author = models.ForeignKey("User", on_delete=models.CASCADE, related_name="author")
content = models.TextField()
dateTime = models.DateTimeField()
Я пытаюсь использовать jquery для достижения того, что я хочу, но я не понимаю, почему это не работает. Кто-нибудь может мне помочь?