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

时间:2019-06-04 20:47:50

标签: python django django-models django-forms django-2.2

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

最后,您可以从ModelForm中完全排除模型字段,也可以将其标记为只读。

所有这些都已被FWIW充分记录,因此,我建议您花一些时间阅读文档,然后再使用离奇而又令人费解的“解决方案”(提示:您绝对不需要中间件来获得原始价值) ,它仍然在您的数据库中-直到您覆盖它为止。