Первоначально Django ModelForm не работает, если только в <form> - PullRequest
0 голосов
/ 20 апреля 2011

Возможно, я иду из-за плохого подхода, но предположим, что это общий сценарий:

У меня есть блоги, в которых есть комментарии.На странице блога есть форма для создания комментариев.Комментарии имеют ModelForm, фактический HTML выполняется выборочно.Внешний ключ, конечно, не виден и не отображается.При отправке внешний ключ комментария должен быть связан с блогом.

Если я использую начальный с внешним ключом блога с комментарием ModelForm, он не сохраняется в POST.Имеет смысл, так как это не в форме тега.

Я могу прикрепить его после POST в представлении, которое вызывает форма, но ModelForm (request.POST) .data не является изменяемым.Я могу сделать ModelForm (request.POST) .save (commit = False), но это означает, что внешний ключ модели комментария к блогу может быть пустым, что на самом деле не имеет смысла с точки зрения модели.

Как правильно это сделать?Похоже, довольно стандартное использование.

Спасибо

Ответы [ 2 ]

1 голос
/ 21 апреля 2011

Вот еще один способ:

def add_comment(request, blog_id):
    blog = get_object_or_404(Blog, blog_id)

    comment = Comment(blog=blog)

    if request.method=='POST':
        form = CommentForm(request.POST, instance=comment)
        if form.is_valid():
            form.save()
            return HttpResponse('success')
    else:
        form = CommentForm(instance=comment)

    context = { 'blog':blog,
                'form':form, }

    return render_to_response('add-comment.html', context,
        context_instance=RequestContext(request))
0 голосов
/ 21 апреля 2011

Я полагаю, что ваш взгляд знает, с каким экземпляром Blog он имеет дело.

# get an unsaved comment instance
comment = form.save(commit=False)

# set the foreign key to blog
comment.blog = blog

# save it to the db
comment.save()

Это стандартный способ сделать это. Да, внешний ключ экземпляра комментария к блогу в течение короткого времени равен None, но это не имеет значения, если вы его не сохраняете (или в определении FK установлено значение null = True). Фиксация = Ложь означает, что она не попадает в базу данных, поэтому вы должны позже сохранить комментарий вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...