Как сохранить обновленный пост пользователя Django в социальных сетях?
Гол
- Пользователь может редактировать сообщение, которое сделал этот конкретный пользователь. Просто нажмите кнопку редактировать, затем отредактируйте, затем нажмите кнопку сохранить.
Проблема
- Когда я редактирую пост в социальной сети, он не сохраняется
Описание
- Я могу сделать новый пост, как в социальных сетях
- Поместить его в список, где все другие пользователи размещают свои сообщения (сокращенно 200 символов только видимые)
- Потом я могу нажать на кнопку "Details button", которая переводит меня на другую страницу, где я могу увидеть полную длину поста .
- Здесь есть кнопка под названием "редактировать", она должна появляться только у создателя сообщения .
- Если вы нажмете кнопку "редактировать", появится окно, в котором уже есть ваш существующий пост, скопированный в поле ввода .
- где вы можете отредактировать свое сообщение
- целью было бы, чтобы вы нажали сохранить, это должно сохранить его вниз, но этого не происходит .
- Интересно, что если я закрываю всплывающие окна с помощью маленькой кнопки [X] или кнопки "отмена" и возвращаюсь назад, то он запоминает мои правки там .
Функция просмотра
@login_required
def social_post_detail(request, pk):
social_post = get_object_or_404(social_post, pk=pk)
form = None
if request.user == social_post.created_by:
if request.method == 'POST':
print(request.POST)
form = social_postForm(request.POST, instance=social_post)
if form.is_valid():
form.save()
return redirect('social_post_list')
else:
form = social_postForm(instance=social_post)
return render(request, 'social_post_detail.html', {'social_post': social_post, 'form': form})
### new edit
from django.shortcuts import render, redirect
from .models import social_post
from .forms import social_postForm
def social_post_edit(request, pk):
social_post = social_post.objects.get(pk=pk)
if request.method == 'POST':
form = social_postForm(request.POST, instance=social_post)
if form.is_valid():
form.save()
return redirect('social_post_detail', pk=social_post.pk)
else:
form = social_postForm(instance=social_post)
return render(request, 'social_post/social_post_edit.html', {'form': form})
Вид функции унифицирован 1 функция вместо 2
Я пробовал по одному, но ни один не сработал
########## ALL IN 1 FUNCTION #1 ##########
@login_required
def social_post_detail(request, pk):
social_post = get_object_or_404(social_post, pk=pk)
if request.user != social_post.created_by:
return redirect('social_post_list')
if request.method == 'POST':
form = social_postForm(request.POST, instance=social_post)
if form.is_valid():
form.save()
return redirect('social_post_list')
else:
form = social_postForm(instance=social_post)
return render(request, 'social_post_detail.html', {'social_post': social_post, 'form': form})
######### ALL IN 1 FUNCTION #2 ########## 2023.02.01
@login_required
def social_post_detail(request, id):
social_post = get_object_or_404(social_post, id=id)
social_post = social_post.objects.get(pk=pk)
if request.method == "POST":
form = social_postForm(request.POST, instance=social_post)
if form.is_valid():
form.save()
return redirect('social_post_list')
else:
form = social_postForm(instance=social_post)
return render(request, 'social_post/social_post_detail.html', {'social_post': social_post, 'form': form})
HTML
social_post.html details
{% extends 'base.html' %}
{% block content %}
<h1>{{ social_post.title }}</h1>
<p>{{ social_post.description }}</p>
<a href="{% url 'social_post_list' %}" class="btn btn-primary">Back to social_post List</a>
<button type="button" class="btn btn-primary" id="editsocial_postButton">Edit social_post</button>
<script>
document.getElementById("editsocial_postButton").addEventListener("click", function() {
$('#editModal').modal('show');
});
</script>
<div class="modal fade" id="editModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Edit social_post</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<form method="post">
{% csrf_token %}
<div class="form-group">
<label for="title">social_post Title</label>
<input type="text" class="form-control" name="title" value="{{ social_post.title }}">
</div>
<div class="form-group">
<label for="description">social_post Description</label>
<textarea class="form-control" name="description">{{ social_post.description }}</textarea>
</div>
{{ form.as_p }}
<button type="submit" class="btn btn-primary">Save Changes</button>
<button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
</form>
</div>
</div>
</div>
</div>
{% endblock %}
Нет сообщения об ошибке
- Я не получаю никакого сообщения об ошибке
- После нажатия кнопки сохранения распечатывается только следующий терминал
[02/Feb/2023 00:43:52] "GET /social_post/social_post/1/ HTTP/1.1" 200 7142
[02/Feb/2023 00:44:13] "POST /social_post/social_post/1/ HTTP/1.1" 200 7142
Мои предположения
- Я борюсь с импортом JS и CSS, они могут вызвать ошибку.
Похоже, что вы упускаете случай, когда ваша форма отправки недействительна. Потому что если вы успешно сохранили форму, она должна ответить 301 редиректом, а не 200
if form.is_valid():
form.save()
else:
print(form.errors)
Выведите ошибку и отлаживайте дальше.
Если вы используете django.contrib.messages
, вы можете показать свои ошибки на самом деле
from django.contrib import messages
if form.is_valid():
#...
else:
messages.error(request, messages.INFO, str(form.errors))
return redirect('social_post_detail', pk=social_post.pk)