2

这是一个简单的场景:我有一篇附有评论的博客文章。现在我想使用 mongoforms 让用户提交他们的评论。因此我有这个models.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 功能,在forms.py 中

class CommentForm(MongoForm):
    class Meta:
        document = Comment
        fields = ('author', 'body')

views.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())

然后,一旦我单击提交按钮,就会出现错误消息:

实例必须是 mongoengine 文档,而不是 BaseList

所以问题是:

  1. 如何将 BaseList 转换为 MongoEngine 中的文档?我在没有任何提示的情况下浏览了文档。
  2. 这里通常处理 EmbeddedDocument 的最佳做法是什么?ReferenceDocument 会有帮助吗?

这里还有一个相关的问题,但没有答案: 在 mongoengine 中更新嵌入文档的列表字段的正确方法是什么?

4

1 回答 1

2

嵌入评论后,您需要在帖子对象中查找并更新现有评论。然后,您可以用新评论(其中i是索引)覆盖旧评论,例如:

post.comments[i] = new_comment

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

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

Post.objects(pk=post.pk).update(set__comments__i=comment)

表格.py

我仍然使用 forms.py 但我会传递commit=Falsesave它将返回评论 - 然后附加到帖子并像这样保存帖子:

def add_comment(request, id):
    post = Post.objects.with_id(id)
    if request.method == 'POST':
        form = CommentForm(request.POST)
        if form.is_valid():
            comment = form.save(commit=False)
            post.comments.append(comment)
            post.save()
    return HttpResponseRedirect(post.get_absolute_url())
于 2012-01-31T10:08:11.273 回答