为什么我不能保存对 Django ModelForm 博客的编辑?
Why I can't save the edit of a Django ModelForm blog?
我正在做 Python 速成班。 19-1:博客,我现在坚持保存任何博客的编辑。我尝试在 blog.html 中插入 .errors 代码(用于显示每个博客)但它什么也没显示,所以我猜我的模板没有字段错误 (?)
这里有一些我认为对解决 not-saving-the-edit 问题至关重要的代码。 views.py 中的 new_blog 函数工作正常,所以我将跳过它。
views.py中的edit_blog函数:
def edit_blog(request, blog_id):
idk = BlogPost.objects.get(id = blog_id)
if request.method != "POST":
form = BlogForm(instance = idk)
else:
form = BlogForm(instance = idk, data = request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse('blogs:blogs'))
content = {"editing_blog": form, "psst": idk}
return render(request, 'blogs/edit_blog.html', content)
new_blog.html:
{% extends "blogs/all.html" %}
{% block content %}
<p>Write a new blog:</p>
<form action="{% url 'blogs:new_blog' %}" method='post'>
{% csrf_token %}
<table border="1">
{{ new_blog }}
</table>
<p></p>
<button name="submit">Submit</button>
</form>
{% endblock content %}
编辑_blog.html:
{% extends "blogs/all.html" %}
{% block content %}
<p>Edit the blog:</p>
<form action="{% url 'blogs:blog' psst.id %}" method='post'>
{% csrf_token %}
<table border="1">
{{ editing_blog }}
</table>
<p></p>
<button name="submit">Save changes</button>
</form>
{% endblock content %}
顺便说一句,urlpattern 在这里:
from django.urls import path, include
from . import views
app_name = 'blogs'
urlpatterns = [
# Home page
path('', views.homepage, name = 'homepage'),
# Show all blogs.
path('blogs/', views.blogs, name = 'blogs'),
# Show the detail of a blog.
path('blogs/<int:blog_id>', views.blog, name = 'blog'),
# Page for adding a new blog.
path('new_blog/', views.new_blog, name = 'new_blog'),
# Page for editing a blog.
path('edit_blog/<int:blog_id>', views.edit_blog, name = 'edit_blog'),
]
无论我如何更改博客的标题和/或内容,我都没有看到更改已保存。是吗:
A) 我在 edit_blog.html 中的表单操作出错了,正如 wakandan 提到的?
B) 我需要在 edit_blog 视图函数中调整一些东西,就像 Bibhas 说的?
非常感谢。还告诉我是否需要添加更多代码来理解。
您的表单操作当前设置为 {% url 'blogs:blog' psst.id %}
,这意味着您正在发布到 views.blog
视图,这只是一个详细视图。您需要将操作更改为 {% url 'blogs:edit_blog' psst.id %}
,以便将表单发布到您的编辑视图。
从您发布的代码中不清楚 editing_blog
上下文变量的来源 - 您需要确保这是您的编辑视图正在寻找的相同表单的实例,否则你会 运行 陷入其他问题。
最后还要注意,您目前没有处理表单有错误的情况 - 即没有为 form.is_valid()
指定的 else
条件。
我正在做 Python 速成班。 19-1:博客,我现在坚持保存任何博客的编辑。我尝试在 blog.html 中插入 .errors 代码(用于显示每个博客)但它什么也没显示,所以我猜我的模板没有字段错误 (?)
这里有一些我认为对解决 not-saving-the-edit 问题至关重要的代码。 views.py 中的 new_blog 函数工作正常,所以我将跳过它。
views.py中的edit_blog函数:
def edit_blog(request, blog_id):
idk = BlogPost.objects.get(id = blog_id)
if request.method != "POST":
form = BlogForm(instance = idk)
else:
form = BlogForm(instance = idk, data = request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse('blogs:blogs'))
content = {"editing_blog": form, "psst": idk}
return render(request, 'blogs/edit_blog.html', content)
new_blog.html:
{% extends "blogs/all.html" %}
{% block content %}
<p>Write a new blog:</p>
<form action="{% url 'blogs:new_blog' %}" method='post'>
{% csrf_token %}
<table border="1">
{{ new_blog }}
</table>
<p></p>
<button name="submit">Submit</button>
</form>
{% endblock content %}
编辑_blog.html:
{% extends "blogs/all.html" %}
{% block content %}
<p>Edit the blog:</p>
<form action="{% url 'blogs:blog' psst.id %}" method='post'>
{% csrf_token %}
<table border="1">
{{ editing_blog }}
</table>
<p></p>
<button name="submit">Save changes</button>
</form>
{% endblock content %}
顺便说一句,urlpattern 在这里:
from django.urls import path, include
from . import views
app_name = 'blogs'
urlpatterns = [
# Home page
path('', views.homepage, name = 'homepage'),
# Show all blogs.
path('blogs/', views.blogs, name = 'blogs'),
# Show the detail of a blog.
path('blogs/<int:blog_id>', views.blog, name = 'blog'),
# Page for adding a new blog.
path('new_blog/', views.new_blog, name = 'new_blog'),
# Page for editing a blog.
path('edit_blog/<int:blog_id>', views.edit_blog, name = 'edit_blog'),
]
无论我如何更改博客的标题和/或内容,我都没有看到更改已保存。是吗:
A) 我在 edit_blog.html 中的表单操作出错了,正如 wakandan 提到的?
B) 我需要在 edit_blog 视图函数中调整一些东西,就像 Bibhas 说的?
非常感谢。还告诉我是否需要添加更多代码来理解。
您的表单操作当前设置为 {% url 'blogs:blog' psst.id %}
,这意味着您正在发布到 views.blog
视图,这只是一个详细视图。您需要将操作更改为 {% url 'blogs:edit_blog' psst.id %}
,以便将表单发布到您的编辑视图。
从您发布的代码中不清楚 editing_blog
上下文变量的来源 - 您需要确保这是您的编辑视图正在寻找的相同表单的实例,否则你会 运行 陷入其他问题。
最后还要注意,您目前没有处理表单有错误的情况 - 即没有为 form.is_valid()
指定的 else
条件。