Представление обновления не отображает данные
У меня есть представление на основе функции, которое не загружает введенные данные. Представление не выдает никакой ошибки. Оно просто представляет форму как пустую.
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).