也许我会采用糟糕的方法,但假设这种通用方案:
我的博客有评论。博客页面包含用于创建评论的表单。注释有一个ModelForm,实际的HTML是有选择地完成的。外键当然不可见或呈现。提交时,评论的外键需要与博客相关联。
如果我使用注释ModelForm的博客外键初始化,它不会在POST中持久存在。有意义,因为它不在表单标签中。
我可以在POST之后在形式调用的视图中附加它,但ModelForm(request.POST).data是不可变的。我可以做ModelForm(request.POST).save(commit = False),但这意味着评论的模型的博客外键可能是空白的,从模型的角度来看,这没有任何意义。
这样做的正确方法是什么?看起来非常标准。
由于
答案 0 :(得分:1)
这是另一种方式:
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))
答案 1 :(得分:0)
我假设您的视图知道它正在处理哪个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()
这是执行此操作的标准方法。是的,您的评论实例的博客外键很短时间内是无,但只要您不保存它就无关紧要(或者在FK定义中设置为null = True)。 commit = False意味着它没有命中数据库,这就是你必须稍后手动保存注释的原因。