在 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 项目,获取表单对象没有属性“保存”