Представление обновления не отображает данные

У меня есть представление на основе функции, которое не загружает введенные данные. Представление не выдает никакой ошибки. Оно просто представляет форму как пустую.

urls.py

    path('edit/<slug>/', editPost, name='edit'),

views.py

@login_required
def editPost(request, slug):
    if request.method == 'POST':
        post = get_object_or_404(Post, slug=slug)
        form = PostForm(request.POST or None, request.FILES or None, instance=post)
        if form.is_valid():
            post.author = request.user.username
            post.updated = True
            form.save()
            return redirect('dashboard')
    else:
        form = PostForm(request.POST, request.FILES, instance=post)
    return render(request, 'edit_post.html', {'form': form})

шаблон

<form class="dropdown-item" action="{% url 'edit' slug=post.slug %}" method="post">{% csrf_token %}
                                    <input class="btn btn-sm" type="submit" value="Edit">

рендер формы в шаблоне, используя {{ form.as_p }}

<form class="dropdown-item" action="{% url 'edit' slug=post.slug %}" method="post">
    {% csrf_token %}
  <!-- render form here -->
  {{ form.as_p }}
  <input class="btn btn-sm" type="submit" value="Edit">
</form>

или перебирайте поля формы как

<form class="dropdown-item" action="{% url 'edit' slug=post.slug %}" method="post">
    {% csrf_token %}
    <!-- render form here -->
    {% for field in form %}
      {{ field.label }}
      {{ field }}
      {{ field.error }}
    {% endfor %}
  <input class="btn btn-sm" type="submit" value="Edit">
</form>
@login_required
def editPost(request, slug):
    post = get_object_or_404(Post, slug=slug)
    if request.method == 'POST':
        form = PostForm(request.POST or None, request.FILES or None, instance=post)
        if form.is_valid():
            post.author = request.user.username
            post.updated = True
            form.save()
            return redirect('dashboard')
    else:
        form = PostForm(instance=post)
    return render(request, 'edit_post.html', {'form': form})

Возможно, вам нужно сделать что-то подобное, нет никакой причины передавать request.POST и request.FILES, когда у вас нет POST действия в представлении. В этом случае вам просто нужно передать объект post, который содержит всю связанную информацию.

А также вы должны отобразить вашу форму следующим образом:

<form class="dropdown-item" action="{% url 'edit' slug=post.slug %}" method="post" enctype="multipart/form-data">
    {% csrf_token %}
  <!-- render form here -->
  {{ form.as_p }}
  <input class="btn btn-sm" type="submit" value="Edit">
</form>

Обратите внимание, что enctype="multipart/form-data" является обязательным, потому что вы имеете дело с файлами в вашей форме, в другом месте она не будет работать должным образом.

Также проверьте, где вы должны поместить вашу строку post = get_object_or_404(Post, slug=slug), потому что таким образом вы можете передать объект в любое действие, которое выполняется (POST или GET).

Вернуться на верх