Как сохранить обновленный пост пользователя 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">&times;</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)
Вернуться на верх