为啥我无法保存 Django ModelForm 博客的编辑?

Posted

技术标签:

【中文标题】为啥我无法保存 Django ModelForm 博客的编辑?【英文标题】:Why I can't save the edit of a Django ModelForm blog?为什么我无法保存 Django ModelForm 博客的编辑? 【发布时间】:2019-09-18 03:41:21 【问题描述】:

我正在上 Python Crash Course Ex。 19-1:博客,我现在正忙于保存任何博客的编辑。我尝试在 blog.html 中插入 .errors 代码(用于显示每个博客),但它什么也没显示,所以我猜我的模板没有字段错误(?)


这里有一些我认为对于解决不保存编辑问题至关重要的代码。 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 %

edit_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) 如wakandan 所述,我在 edit_blog.html 中的表单操作出错了?

B)我需要在edit_blog视图功能中进行一些调整,比如Bibhas说的?

非常感谢。还请告诉我是否需要添加更多代码以供理解。

【问题讨论】:

你的edit_blog函数被调用了吗,写一个打印语句,看看表单提交是否真的提交给edit_blog函数。 shell 上的打印语句,views.py 还是模板? 能否提供用于匹配edit_blog 视图路径的urlpattern? 当然。见代码部分。 【参考方案1】:

您的表单操作当前设置为% url 'blogs:blog' psst.id %,这意味着您正在发布到您的views.blog 视图,这只是一个详细视图。您需要将操作更改为% url 'blogs:edit_blog' psst.id %,以便将表单发布到您的编辑视图。

从您发布的代码中不清楚 editing_blog 上下文变量的来源 - 您需要确保这是您的编辑视图正在寻找的相同表单的实例,否则您将遇到其他问题。

最后还要注意,您当前没有处理表单有错误的情况 - 即,没有为 form.is_valid() 指定 else 条件。

【讨论】:

不用担心editing_blog 变量。如果我在edit_blog 模板和edit_blog 视图函数的content dict 中将其更改为其他名称,则它可以工作。

以上是关于为啥我无法保存 Django ModelForm 博客的编辑?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 Django ModelForm 不会引发 unique_together 约束的验证错误?

Django ModelForm 不保存数据

在没有 django ModelForm 的情况下从用户上传图像的问题

我的 Django ModelForm 是未绑定的吗?

ImageField() 不在 ModelForm 中保存图像 - Django/Python

使用覆盖保存为抽象模型扩展 Django ModelForm