为什么执行 form.is_valid() 会导致删除不在 Django 表单中的实例字段?

Why executing form.is_valid() cause deleting of the instance fields that aren't in the form in django?

假设此视图用于编辑记录:

def edit_post(request, slug):
    post = get_object_or_404(Post, slug=slug)
    if request.method == "POST":
        form = AddPostForm(request.POST, request.FILES, instance=post)
        # 1
        if form.is_valid():
            # 2
            new_post = form.save(commit=False)
            new_post.save() 
            return redirect('administrator:view_admin_post')
    ...

现在假设这些:

  1. 我有 field1 存在于 POST 模型中。

  2. field1 有默认值,假设当前值为 field1 取决于上一个。

  3. 还假设我不想将 field1 传递给用户。作为一个 结果,我不会在 request.POST.

在这种情况下,当我在行 print(post.field1) 中写入 # 1 我有以前的值,但是当我打印它时 第 # 2 行我得到了 None

这是怎么回事?我怎样才能拥有我的 post.field1

注意:我知道我可以定义一个中间件变量并将之前的值保存在这个变量中。但是有更好的方法吗?

第一点:.is_valid() 不会触及您的数据库(除非您自定义表单的验证,但是,那么,您就会知道为什么 xD)。这是对 Model.save() 的调用(直接或通过 form.save())覆盖了先前的值。

第二点:如果您将模型实例传递给您的表单(这是您所做的),您可以通过模板中的 {{ form.instance.your_field_name }} 访问它(及其字段)。

最后,您可以从 ModelForm 中完全排除模型字段,或者将其标记为 read-only。

所有这些都在 FWIW 中得到了很好的记录,所以我建议你在进一步研究奇怪和令人费解的问题之前花一些时间阅读文档 "solutions"(提示:你绝对不需要中间件来获取原始值,它仍然在您的数据库中 - 直到您覆盖它为止)。