Django在保存视图时设置user_id

时间:2011-12-25 23:15:53

标签: django django-forms

我需要在添加视图中设置正在创建帖子的用户:

@login_required 
def add(request):
    if request.method == 'POST':
        form = BusinessForm(request.POST)
        form.user_id = request.user.id
        if form.is_valid():
            form.save()
            return HttpResponseRedirect(reverse('listing.views.detail'), args=(f.id))
    else:
        form = BusinessForm()
    return render_to_response('business/add.html', {'form':form},
        context_instance=RequestContext(request))

我指定了用户ID form.user_id = request.user.id,但在保存时,它仍然给我一个错误Column user_id cannot be null

我做错了吗?感谢

编辑:

我从模型中的表单中排除用户:

class BusinessForm(ModelForm):
    class Meta:
        model = Business
        exclude = ('user',)

这会导致问题吗?我该如何解决这个问题?

编辑2:

按照建议编辑了我的BusinessForm()类但没有工作:

class BusinessForm(ModelForm):
    class Meta:
        model = Business
        exclude = ('user',)
    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request', None)
        return super(BusinessForm, self).__init__(*args, **kwargs)

    def save(self, *args, **kwargs):
        kwargs['commit']=False
        obj = super(BusinessForm, self).save(*args, **kwargs)
        if self.request:
            obj.user = self.request.user
        obj.save()

商业模式

class Business(models.Model):
    name = models.CharField(max_length=200)
    user = models.ForeignKey(User, unique=False)
    description = models.TextField()
    category = models.ForeignKey(Category)
    address = models.CharField(max_length=200)
    phone_number = models.CharField(max_length=10)
    website = models.URLField()
    image = models.ImageField(upload_to='business_pictures',blank=True)

2 个答案:

答案 0 :(得分:11)

您不必为此使用initsave覆盖。

您只是在表单上设置属性,表单不会对其执行任何操作。它不会像模型实例那样神奇地表现(您的表单不会有user_id属性)。

由于您的表单是ModelForm,因此只需使用commit=False调用save即可获取未保存的实例,设置用户,然后在实例上调用save

 if request.method == 'POST':
    form = BusinessForm(request.POST)
    if form.is_valid():
        business = form.save(commit=False)
        business.user = request.user
        business.save()

答案 1 :(得分:0)

this似乎正是您所寻找的。