除非在<form>中,否则Django ModelForm初始化不起作用

也许我会采用一种糟糕的方法,但假设这种通用场景:

我有博客有评论 . 博客页面包含用于创建评论的表单 . 注释有一个ModelForm,实际的HTML是有选择地完成的 . 外键当然不可见或呈现 . 提交时,评论的外键需要与博客相关联 .

如果我使用注释ModelForm的博客外键初始化,它不会在POST中持久存在 . 有意义,因为它不在表单标签中 .

我可以在POST之后在形式调用的视图中附加它,但ModelForm(request.POST).data不可变 . 我可以做ModelForm(request.POST).save(commit = False),但这意味着评论的模型的博客外键可能是空白的,从模型的角度来看,这没有任何意义 .

这样做的正确方法是什么?看起来像一个非常标准的用法 .

谢谢

回答(2)

2 years ago

这是另一种方式:

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))

2 years ago

我假设您的视图知道它正在处理哪个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意味着它没有命中数据库,这就是你必须稍后手动保存注释的原因 .