首页 文章

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

提问于
浏览
0

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

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

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

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

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

谢谢

2 回答

  • 0

    这是另一种方式:

    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

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

相关问题