Django在保存视图时设置user_id

Ale*_*and 4 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))
Run Code Online (Sandbox Code Playgroud)

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

难道我做错了什么?谢谢

编辑:

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

class BusinessForm(ModelForm):
    class Meta:
        model = Business
        exclude = ('user',)
Run Code Online (Sandbox Code Playgroud)

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

编辑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()
Run Code Online (Sandbox Code Playgroud)

商业模式

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)
Run Code Online (Sandbox Code Playgroud)

Yuj*_*ita 11

您不必为此使用initsave覆盖.

您只需在表单上设置属性,表单不会对其执行任何操作.它没有神奇地表现得像一个模型实例(你的表单没有user_id属性).

由于您的表单是a ModelForm,您可以简单地调用save commit=False来获取未保存的实例,设置用户,然后调用save实例.

 if request.method == 'POST':
    form = BusinessForm(request.POST)
    if form.is_valid():
        business = form.save(commit=False)
        business.user = request.user
        business.save()
Run Code Online (Sandbox Code Playgroud)

  • 你确定?这不应该发生.将原始ModelForm仅与Meta类一起使用,不使用init/save覆盖. (3认同)