如何在Django 1.9中获取created_by字段的当前用户?

时间:2016-03-26 17:10:05

标签: django httprequest

我正在尝试将会话用户拉入我模型的save()方法。 The docs for HttpRequest我发现的所有示例都假设您已经将对象设置为instanciated,但我似乎无法找到一个可以进行实例化的方法。

我想我应该使用HttpRequest.user,但我不知道如何在我的模型中生成实例,所以我实际上可以这样做。

这是我的save()覆盖。它生成type object 'HttpRequest' has no attribute 'user',但考虑到这是一个类而不是对象引用并不令人惊讶。:

def save(self, *args, **kwargs):
    ''' On save, update timestamps '''
    if not hasattr(self, 'id'):
        self.date_created = timezone.now()
        self.created_by = HttpRequest.user

    self.last_updated_date = timezone.now()
    self.last_updated_by = HttpRequest.user

    super(Caregiver, self).save(*args, **kwargs)

views.py已添加了更多信息

class CaregiverCreateView(CreateView):
    template_name = 'single_form_generic.html'
    model = Caregiver
    form_class = CaregiverCreateForm

3 个答案:

答案 0 :(得分:2)

django-cuser可以轻松完成此操作。该库添加了可以在视图,模型方法等中调用的中间件,以获取当前用户。如果您可以通过模型的保存方法分配用户,那么您只需要调用中间件来检查会话,如下所示。

设置完成后,可以这样调用:

from cuser.middleware import CuserMiddleware

class YourModel(models.Model):
    def save(self, *args, **kwargs):
        self.created_by = CuserMiddleware.get_user()
        super(YourModel,self).save(*args, **kwargs)

答案 1 :(得分:1)

如果您明确调用order by,则可以将用户实例直接传递给方法:

save()

然后当你在views.py中调用它时,执行:

def save(self, user, *args, **kwargs):
    # use the user

答案 2 :(得分:0)

我不得不稍微挖掘一下,但我最终找到了未来googlers的答案:

class based view docs实际上有一个相关的例子。由于视图已经可以访问请求并且表单和模型可以绑定,因此您只需要通过覆盖form_valid方法将其注入视图提交中。

def form_valid(self, form):
    form.instance.created_by = self.request.user
    form.instance.last_updated_by = self.request.user
    return super(CaregiverCreateView, self).form_valid(form)