Я прочитал два других сообщения, связанных с этой темой, но не смог найти никаких решений для моей проблемы - я не могу получить форму edit_post (edit_post.html), чтобы сохранить изменения, внесенные в форму, и либо перенаправить обратно в индекс страницу или визуализировать страницу с сохраненными изменениями. После нажатия кнопки Сохранить изменения форма возвращается к предыдущему предварительно заполненному состоянию экземпляра до внесения изменений.
Это упражнение 19-1 из Ускоренного курса Python:
19-1. Блог: запустите новый проект Django под названием «Блог». Создайте в проекте приложение под названием blogs и модель под названием BlogPost. Модель должна иметь такие поля, как title, text и date_added. Создайте суперпользователя для проекта и используйте сайт администратора, чтобы сделать пару коротких сообщений. Создайте домашнюю страницу, на которой будут отображаться все сообщения в хронологическом порядке. Создайте форму для создания новых сообщений и другую для редактирования существующих сообщений. Заполните формы, чтобы убедиться, что они работают.
модели.py:
from django.db import models
class Blog_post(models.Model):
"""A blogpost posted by a User"""
title = models.CharField(max_length=200)
body = models.TextField()
date_added = models.DateTimeField(auto_now_add=True)
def __str__(self):
"""Return a string representation of the model."""
return f"{self.title}\n{self.body}"
формы.py:
from django import forms
from .models import Blog_post
class NewPostForm(forms.ModelForm):
class Meta:
model = Blog_post
fields = ['body', 'title']
labels = {'body': '', 'title': "Title:"}
просмотры.py
from django.shortcuts import render, redirect
from .models import Blog_post
from .forms import NewPostForm
def index(request):
"""The home page for Blog."""
posts = Blog_post.objects.order_by('date_added')
context = {'posts': posts}
return render(request, 'blogs/index.html', context)
def new_post(request):
"""Add a new blogpost."""
if request.method != 'POST':
# No data submitted; create a blank form.
form = NewPostForm()
else:
# POST data submitted; process data.
form = NewPostForm(data=request.POST)
if form.is_valid():
form.save()
return redirect('blogs:index')
context = {'form': form}
return render(request, 'blogs/new_post.html', context)
def edit_post(request, post_id):
"""Edit an existing post."""
post = Blog_post.objects.get(id=post_id)
if request != 'POST':
form = NewPostForm(instance=post)
else:
form = NewPostForm(instance=post, data=request.POST)
if form.is_valid():
form.save()
return redirect('blogs:index', post_id=post.id)
context = {'post': post, 'form': form}
return render(request, 'blogs/edit_post.html', context)
urls.py
from django.urls import path
from . import views
app_name = 'blogs'
urlpatterns = [
# Home page
path('', views.index, name='index'),
# Page for adding a new blogpost
path('new_post/', views.new_post, name='new_post'),
# Page for editing an entry.
path('edit_post/<int:post_id>/', views.edit_post, name='edit_post'),
]
index.html
{% extends "blogs/base.html" %}
{% block content %}
<p> This is the Blog project exercise 19-1 on pg 421 of Python Crash Course.</p>
<p> Blogposts: </p>
<ul>
{% for post in posts %}
<li>
<p>{{ post.date_added|date:'M d, Y H:i' }} - {{ post }} -
<a href="{% url 'blogs:edit_post' post.id %}">Edit Post</a>
</p>
</li>
{% empty %}
<li> No topics have been added yet. </li>
{% endfor %}
</ul>
<a href="{% url 'blogs:new_post' %}">Add a new blogpost.</a>
{% endblock content %}
edit_post.html
{% extends "blogs/base.html" %}
{% block content %}
<p>{{ post }}</p>
<p>Edit post:</p>
<form action="{% url 'blogs:edit_post' post.id %}" method='post'>
{% csrf_token %}
{{ form.as_p }}
<button name="submit">Save changes</button>
</form>
{% endblock content %}
Заранее большое спасибо.