Django Modelform在视图中成功验证并保存…但它没有';T

Django Modelform在视图中成功验证并保存…但它没有';T,django,django-models,django-forms,Django,Django Models,Django Forms,嗨 这对我来说是一个意想不到的结果。在我看来,我做了以下几点 (standard view stuff here...) if post: postform=PostForm(request.POST,instance=post, prefix="post") tagform=TagForm(request.POST, instance=post,prefix='tags') ohous

这对我来说是一个意想不到的结果。在我看来,我做了以下几点

        (standard view stuff here...)

        if post:
            postform=PostForm(request.POST,instance=post, prefix="post")
            tagform=TagForm(request.POST, instance=post,prefix='tags')  
            ohouse_form=Host_OHouseForm(request.POST,instance=post,prefix="ohouse")
        else:   
            postform=PostForm(request.POST,prefix="post")
            tagform=TagForm(request.POST, prefix='tags')
            ohouse_form=Host_OHouseForm(request.POST,prefix="ohouse")   

                   (....I first validate that postform and tagform are valid...) 
        if ohouse_form.is_valid():
            ohouse=ohouse_form.save(commit=False)
            ohouse.post=post
            ohouse.host=user
            ohouse.save()
所讨论的表单是一个模型表单。让我困惑的是,视图在表单验证和保存成功的情况下工作正常。模型应该在该点保存…如果表单/模型有任何错误,它将不会验证或引发错误

但是这个实例并没有出现在我的管理后端中。ohouse queryset中也没有


这让我很困惑

我注意到您使用的是前缀。看看我在另一个答案中注意到的奇怪行为

编辑:


您是否打算设置所有instance=post,即使对于OHouse表单也是如此?

基于您的最新更新:

这是非常有希望的进展。这意味着正在进行数据库写入,因为返回该ID是一个DB查询

您还应该
打印类型(ohouse)
。我有一种感觉,你不是在保存一个OHouse对象

我看到您正在将
instance=post
传递到每个
ModelForms
,这可能不对。这将使
Host_OHouseForm({},instance=post)
返回一个新的
post
对象

我打赌这就是问题所在

  if post:
        postform=PostForm(request.POST,instance=post, prefix="post")
        tagform=TagForm(request.POST, instance=post,prefix='tags')  
        ohouse_form=Host_OHouseForm(request.POST,instance=post,prefix="ohouse")

您如何知道表单正在验证?我是说你到底是怎么查的?你说保存也成功了,我不明白:如果不成功怎么可能成功——你怎么检查。打印
“ohouse已保存且id为{id}”。在保存行之后格式化(id=ohouse.id)
以进行调试。。。另外,您是否使用
save()
?很抱歉,很明显,我们在atm机上没有太多东西可供使用。对,所以我通过设置一系列返回HttpResponse语句来“检查”。调试在我的知识库中是一个很大的整体,所以我通常只使用HttpResponse进行调试。如何打印以进行调试?我应该引发错误吗?我没有重写model或modelform save()方法。我想在这里添加更多的代码,但是我的视图太长了(这实际上是个问题,我需要将其拆分为一系列较小的函数),我使用dev服务器进行调试,因为它比生产(自动重置服务器)快10倍。它在控制台中显示打印语句。另一个很好的选择是devserver+
importpdb;set_trace()
(让我们在python shell中嗅探这行代码)。但是你的方法同样适用于捕捉一条精确的线。这条线正在打印以下内容:“ohouse saved and id is 7”。不过,它并没有出现在我的管理中。另外,当我尝试执行以下操作时,它显示0个queryset结果。oh=Host_OHouse.objects.all()在您的示例中返回HttpResponse(oh),这是预期的行为。前缀为“foo”将使表单字段名
foo-test\u field
,这在传入的数据中不存在。您在表单中看到的
数据
就是您将表单构造函数作为第一个参数传递的任何命令。嗨,kriegar。看起来我的数据字段和预期的一样。我也不知道如何删除前缀,即使这是问题的根源。你看,我正在同时保存多个表单,所以我需要前缀…对吗?@Yuji ahh谢谢你的解释,这是我的想法,但海报从未返回,我不熟悉使用前缀。@Brendan你是想设置所有实例=帖子吗?你能再给我看看你的模特吗?@kriegar,我也注意到了。。这绝对是问题所在。他不是在保存房子里的东西。我刚刚测试了
ModelForms
,它们不会对传入的实例类型进行验证并保存。哈哈!我认为你是绝对正确的。我现在要试着改变这一点。如果不是这样的话,我会吃掉我的电脑。你说得对,Yuji。我不知道为什么我认为我可以在实例参数中插入一个外键。你的帮助是无效的让我祈祷那是另外一回事=你在所有答案上都赢了我!哈哈哈哈,对不起,我跑来跑去。我很困惑,因为没有错误。我很惊讶
ModelForms
没有进行类型检查。一定有原因。看,一张很旧的,可以接受的票: