为什么外键不能保存在ModelForm上(1048,“列'post_id'不能为空”)

时间:2011-03-18 18:56:18

标签: django django-models django-forms

这应该是一个简单的问题,但现在它已经让我失望了一段时间。

我想保存一个模型,但我不断收到上述错误。

class Favorite(models.Model):
    post=models.ForeignKey(Post)
      user=models.ForeignKey(User)  
    note=models.TextField(max_length=1000, blank=True)


def listing(request, pid):
    post=get_object_or_404(Post,pk=pid)
    favform=FavoriteForm()
     try:
        ratings=post.post_rating_set.all()
        score=ratings.aggregate(mark=Avg('rating'))
         score=int(score.get('mark',0))-1 
    except AttributeError:
            ratings=''
            score=1000 
    if request.method=="POST" and request.POST.get('save_it',''):
        user=User.objects.get(pk=request.user.id)
        favorite=FavoriteForm(request.POST)
        if favorite.is_valid:

            favorite.save(commit=False)
            favorite.user=user
            favorite.post=post

            favorite.save()

我的表单验证,我已经测试了用户和帖子,它们都包含预期的查询集。我尝试不先保存最喜欢的表单,但也失败了。 m2m不适合这里。

这是mysql设置错误吗?

2 个答案:

答案 0 :(得分:6)

您错误地使用了commit=Falsesave()返回一个实例,而您只是在表单上调用两次保存。

请改为:

        favorite = favorite.save(commit=False) 
        # now, favorite is an instance returned by save.
        favorite.user=user
        favorite.post=post
        favorite.save()

我个人将表单最喜欢的形式命名为区分实例和表单。

答案 1 :(得分:1)

您可以在方法声明之前放置装饰器。

@transaction.commit_on_success
def listing(request, pid):
    post=get_object_or_404(Post,pk=pid)
    ...

并删除此行:

favorite.save(commit=False)