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

时间:2011-04-20 19:21:58

标签: django django-models django-forms

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

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

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

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

这样做的正确方法是什么?看起来非常标准。

由于

2 个答案:

答案 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意味着它没有命中数据库,这就是你必须稍后手动保存注释的原因。