Python 编辑视图保存两次

Python 编辑视图保存两次,python,django,Python,Django,这是我的编辑视图,用于更新帖子,它只更新内容字段。然而,所发生的是帖子保存了两次,因此它在我的查询集中显示了两次。我在视图代码中有2次保存,这就是问题所在,但我如何在此处执行编辑 全景图: def edit(request, id): post = get_object_or_404(Post, id=id) edit_form = EditPostForm(request.POST or None, instance=post) if edit_form.is_vali

这是我的编辑视图,用于更新帖子,它只更新内容字段。然而,所发生的是帖子保存了两次,因此它在我的查询集中显示了两次。我在视图代码中有2次保存,这就是问题所在,但我如何在此处执行编辑

全景图:

def edit(request, id):
    post = get_object_or_404(Post, id=id)
    edit_form = EditPostForm(request.POST or None, instance=post)
    if edit_form.is_valid():
        instance = edit_form.save(commit=False)
        instance.save(update_fields=['content'])
sql:

编辑

观点

编辑帖子时的终端输出:

def edit(request, id):
    post = get_object_or_404(Post, id=id)
    print('CAT:', post.category)
    edit_form = EditPostForm(request.POST or None, instance=post)
    if edit_form.is_valid():
        print('Edit valid')
        instance = edit_form.save(commit=False)
        instance.save(update_fields=['content'])
        return HttpResponseRedirect('/')
    else:
        print('Errors:', edit_form.errors)
        print('Non-field Errors:', edit_form.non_field_errors)
        edit_form = PostForm(instance=post)
    context = {
        'edit_form': edit_form,
        'form_post': post
    }
    return render(request, 'edit.html', context)
当您查看时,它清楚地显示了当commit=False时没有执行sql命令。执行instance.save时,实际的数据库调用将在下一行中进行

如果您看到发生了两次更新,可能是因为表单提交了两次。这可以安全地忽略,因为许多RDBMS足够聪明,不会更新未更改的数据。然而,即使这样,也可以通过在表单处理后使用标准的django重定向模式来避免

def create_post_score(sender, **kwargs):
    score = PostScore.objects.create(post=kwargs['instance'])
    print(score.upvotes)

post_save.connect(create_post_score, sender=Post)

您需要在视图中指定request.method,否则表单也会在get请求中提交。 由于表单已包含post实例,因此表单已有效并已保存

像这样编辑视图

instance = edit_form.save(commit=False)
instance.save(update_fields=['content'])
return HttpResponseRediret('/success_url/')

抱歉,忘了添加已使用HttpResponseRedirect的完整视图,该视图已在editadd中添加。请添加您所说的出现在日志中的sql。但事实上,它可以是ignoredOk,我添加了sql,但出于某种原因,它现在可以工作了。如果我有任何问题,我会回到这里,谢谢。使用与您使用的完全相同的代码,节省了两次。似乎第一个实例=edit\u form.savecommit=False保存它,下一行再次保存它。知道如何只保存一次吗?不,commit=False确保只保存一次,所以问题肯定出在其他地方。通过我的一些旧答案,我发现了这个。它现在排序了吗?仍然没有排序,但是我在编辑中添加了新代码,它显示了我编辑帖子时的视图和终端输出。打印CAT两次或非字段错误可能是原因,但我不确定。此处没有任何内容显示模型被保存两次。每次创建帖子时,也会调用create_post_score来创建PostScore,以跟踪在我的编辑中添加的帖子上的投票。你知道这是否相关吗?你这是什么意思?创建后评分仅在编辑上方。他们和帖子都在同一个views.py文件中。必须调整上下文,因为它在分配作业之前被引用,但它仍然保存两次。仍然保存两次。仍然保存两次帖子还是创建postscore哪一个?每次创建新帖子时,它都会创建一个新的postscore,显示在我的编辑中。因此,当前的情况是编辑创建一个新的帖子以及一个新的PostScore,以便在已经存在的帖子和PostScore之上进行编辑。
CAT: 1
Errors: 
Non-field Errors: <bound method BaseForm.non_field_errors of <EditPostForm bound=False, valid=False, fields=(content)>>
[23/May/2017 04:37:22] "GET /post/edit/37/ HTTP/1.1" 200 7430
CAT: 1
Edit valid
def create_post_score(sender, **kwargs):
    score = PostScore.objects.create(post=kwargs['instance'])
    print(score.upvotes)

post_save.connect(create_post_score, sender=Post)
instance = edit_form.save(commit=False)
instance.save(update_fields=['content'])
return HttpResponseRediret('/success_url/')
def edit(request, id):
    post = get_object_or_404(Post, id=id)
    #If it is a POST request do the thing below.
    if request.method == "POST":
        edit_form = EditPostForm(request.POST or None, instance=post)
        if edit_form.is_valid():
            form.instance.save(update_fields=['content'])
            return HttpResponseRedirect('/')
    else:
        edit_form = EditPostForm(instance=post)
    context = {
            'edit_form': edit_form,
            'form_post': post
            }
    return render(request, 'edit.html', context)