这里有一个简单的场景:我有一篇博客文章,上面附有评论。现在我想使用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
所以问题是:
这里还有一个相关的问题,但没有答案: What is the proper way to update a listfield of embedded documents in mongoengine?
由于注释是嵌入的,您需要在post对象中查找和更新现有的注释。然后可以用新注释覆盖旧注释(其中i是索引),例如:
然后只需执行一个
post.save()
操作,mongoengine就会将其转换为$set
操作。在或者,您可以直接编写
^{pr2}$$set
,例如:表单.py
我仍然使用表单.py但我会将
^{3}$commit=False
传递给save
,这将返回评论-然后附加到文章并保存帖子,如下所示:相关问题 更多 >
编程相关推荐