将表单保存/更新为EmbeddedDocumen

2024-03-28 17:56:56 发布

您现在位置:Python中文网/ 问答频道 /正文

这里有一个简单的场景:我有一篇博客文章,上面附有评论。现在我想使用mongoforms让用户提交他们的评论。所以我有这个模型.py

class Post(Document):
    title = StringField(max_length=60)
    body = StringField()
    created = DateTimeField(default=datetime.datetime.now)
    comments = ListField(EmbeddedDocumentField('Comment'))

class Comment(EmbeddedDocument):
    author = StringField(max_length=60)
    body = StringField()
    created = DateTimeField(default=datetime.datetime.now)

我使用django-mongoforms来支持类似的ModelForm功能,在中表单.py

^{pr2}$

视图.py,我只想保存用户输入的内容,尤其是评论的作者和正文字段,下面是添加注释的方法:

def add_comment(request, id):
    post = Post.objects.with_id(id)
    if request.method == 'POST':
        form = CommentForm(request.POST, instance=post.comments)
        if form.is_valid():
            form.save()
    return HttpResponseRedirect(post.get_absolute_url())

然后,单击“提交”按钮,就会出现错误消息:

instance must be a mongoengine document, not BaseList

所以问题是:

  1. 如何在MongoEngine中将BaseList转换成文档?我已毫无提示地浏览了文件。在
  2. 这里处理嵌入文档的最佳实践是什么?参考文档有帮助吗?在

这里还有一个相关的问题,但没有答案: What is the proper way to update a listfield of embedded documents in mongoengine?


Tags: 用户文档pyformiddatetimerequest评论
1条回答
网友
1楼 · 发布于 2024-03-28 17:56:56

由于注释是嵌入的,您需要在post对象中查找和更新现有的注释。然后可以用新注释覆盖旧注释(其中i是索引),例如:

post.comments[i] = new_comment

然后只需执行一个post.save()操作,mongoengine就会将其转换为$set操作。在

或者,您可以直接编写$set,例如:

^{pr2}$

表单.py

我仍然使用表单.py但我会将commit=False传递给save,这将返回评论-然后附加到文章并保存帖子,如下所示:

^{3}$

相关问题 更多 >