2012-01-31 2 views
2

Вот простой сценарий: у меня есть сообщение в блоге с комментариями к нему. Теперь я хочу использовать mongoforms, чтобы пользователь мог отправлять свои комментарии. Поэтому у меня есть эта models.py:Сохраните/обновите форму до EmbeddedDocument

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? Будет ли HelpDocument помочь?

Также есть смежные вопросы здесь, но без ответа: What is the proper way to update a listfield of embedded documents in mongoengine?

ответ

2

В комментарии встраивается вам нужно найти и обновить существующий комментарий в посте объекта. Затем вы можете перезаписать старый комментарий с новым комментарием (где я является индекс), например:

post.comments[i] = new_comment 

затем просто сделать post.save() и mongoengine преобразует что в $set операции.

В качестве альтернативы, вы можете просто написать $set непосредственно, например:

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

forms.py

я до сих пор используют forms.py, но я передам commit=False к save, возвращающие комментарий - затем присоединитесь к сообщению и сохраните сообщение так:

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()) 
+0

Эта работа ред! Благодарим вас за теплую помощь как на freenode, так и на этом пути. – Liki

Смежные вопросы