【问题标题】:Setting user_id when saving in view - Django在视图中保存时设置 user_id - Django
【发布时间】:2012-01-27 18:14:12
【问题描述】:

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

@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)

【问题讨论】:

  • 我不认为排除一个字段会导致问题,请查看this以获取如何实现您想要的示例

标签: django django-forms


【解决方案1】:

您不必为此使用 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()

【讨论】:

  • 你确定?那不应该发生。使用只有 Meta 类且没有初始化/保存覆盖的原始 ModelForm。
  • 是的。这不会导致验证失败吗?因为它没有用户ID?
  • 您排除用户的原因是绕过验证。没问题!
  • 这条评论需要用大写的大字张贴在某处。我浪费了两个小时试图修改我的__init__save 方法,所以我可以简单地将模型中的user_id 设置为request.user.id。一旦你指出来,逻辑就很明显了。谢谢
  • @Cole,我补充说您不需要覆盖 init 或在第一行保存!
【解决方案2】:

this 似乎正是您想要的。

【讨论】:

  • 试过了,似乎不起作用...我添加了 init 并将方法保存到 BusinessForm(ModelForm) 类
  • 您的 user_id 字段是否与用户模型(docs.djangoproject.com/en/dev/ref/models/fields/#foreignkey)相关,在您的 Business 模型中也是成员 user_id 或用户?
  • 添加商业模式问题
  • 那么我认为最初你有 form.user_id = request.user.id 它应该是 form.user = request.user.id (可能没有.id
  • @TomIngram 用户模型字段仅存在于模型实例上 - 而不是 django 表单。设置属性不会失败,但不会做任何事情。
猜你喜欢
  • 1970-01-01
  • 2012-08-01
  • 2017-03-04
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
  • 2011-01-21
  • 2011-07-23
  • 1970-01-01
相关资源
最近更新 更多