在 Django 中获取模型表单的保存对象?

Posted

技术标签:

【中文标题】在 Django 中获取模型表单的保存对象?【英文标题】:Get saved object of a model form in Django? 【发布时间】:2017-06-21 12:09:02 【问题描述】:

我只想在 Django 中使用模型表单发布模型详细信息后访问它。这个guy 也问过同样的问题,但是当我尝试 接受的答案,它返回无类型值。

这是我在“views.py”中的代码:

if request.method == 'POST':
    if request.user.is_authenticated():
        form = PostStoryForm(request.POST)
        if form.is_valid():
            obj = form.save(commit=False)
            obj.author = request.user
            new_post = obj.save()
            print(new_post)

上面的代码成功地将表单保存到数据库中,但“new_post”变量为“None”。例如,当我尝试访问模型中的字段“new_post.title”时,它返回“AttributeError”,表示“NoneType”对象没有属性“title”

我做错了什么?

【问题讨论】:

我认为我们也需要保存您的表单。 模型save() 不会像save() 方法那样返回实例。 【参考方案1】:

modelssave() 方法不返回实例

obj.author = request.user
obj.save() # this does not return anything. It just saves the instance it is called on.

您的实例已经设置了author

要访问尚未设置的自动填充字段,您必须在保存后再次从数据库中获取它。当您调用save() 的实例以前不存在时,就是这种情况。

new_obj = MyModel.objects.get(id=obj.id)

【讨论】:

实例为obj。你可以试试print(obj.title),应该可以的。 实际模型还有 3 个字段,例如“修改日期”或“创建日期”或“url”——我可以通过“get_absolute_url”方法访问这些字段,这些字段会自动保存在数据库中:“modified = models .DateTimeField(auto_now=True)"。如果不保存表单模型,我将无法访问这些额外的字段。所以我不能像这样访问“修改”字段:“obj.modified”,因为它还没有被创建。清楚了吗? 是的,但save() 方法不会返回实例,也不会更新调用它的实例上的字段。如果你想访问这些字段,你必须再次从数据库中获取对象。 但是在您已经通过表单的保存方法创建对象的情况下,这些字段应该已经被填充。​​

以上是关于在 Django 中获取模型表单的保存对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何从模型中获取一个项目并使用表单 django 将相同的项目保存在另一个模型中

如何从 django 的表单中获取数据?

在模型 django 中保存表单

无法将图像上传到 Django 项目,获取表单对象没有属性“保存”

Django With MSSQL using Pyodbc:未保存模型表单

在用户注册之前保存 django 模型表单数据