2013-05-19 51 views
4

使用Mongoengine并尝试形成标签云。对于每个项目,我想附加一个或多个标签。这里使用了类似标签的东西(在每个问题的下面)。使用Mongoengine添加和更新ListField

在这里搜索和阅读很多帖子后,我仍然无法向ListField添加新条目的正确方法,或者如何替换它们。

class Item(Document): 
    tags = ListField(StringField(max_length=300)) 

我试图通过使用表单并收集发布的结果来推送一个或多个新标签。在我的views.py我有以下检查:

if 'tags' in request.POST and request.POST['tags'] <> '': 
    for Tag in request.POST.getlist('tags'): 
     ItemData.update(push__tags__S__tags=Tag) 

当试图推它,它失败:

ValidationError(简介:5185505b73ea128e878f4e82)(仅限列表和 元组可以被用在列表字段:['tags'])

很明显,我使用了错误的类型,但我失去了如何解决这个问题。 奇怪的是,由于某种原因,数据被附加到记录,但..(贴“测试”,并刷新浏览器)

“标签”:“测试”,“测试”]}

可以告诉我一个小例子:如何处理发布的字符串(来自HTML表单)并将其正确推入ListField(以及如何将其全部替换)。

谢谢!

回答

6

您不需要位置运算符$,它相当于在mongoengine中的__S__,因为您没有替换/更新列表中的位置。

由于您可能不想重复标签,因此应使用$addToSet。您可以在mongoengine做到这一点,像这样:

ItemData.update(add_to_set__tags=['tag1', 'tag2']) 

在列表传递给add_to_set会自动将它与$each转换为$addToSet

+0

谢谢罗斯。尽管如此,它仍然给我带来了ValidationError(只有列表和元组)。从表单文章接收数据时,如何将正确的格式输入到表单中? – user2391564

+0

将发布数据转换为列表或元组。 – Ross

+0

即使你的例子给我的验证错误。使用x = request.POST.getlist('tags'),它也应该给出一个列表,同样的错误。谷歌搜索几个小时后,试图分裂等,我真的看不出原因。同时我从0.8.0RC1升级到0.8.0RC4,但没有解决。任何额外的积分将非常感激!爱Mongoengine,但学习曲线让我回想一下:) – user2391564