如何在自定义保存方法中获取当前用户?

时间:2015-09-06 15:27:41

标签: python django django-users

我正在使用 Django 1.8 ,我正在尝试实现对模型的简单记录。我已经覆盖了类的save方法。但是,我还想记录哪个用户负责更改,但请求对象不可用,因为它没有传递给save方法。我不想在所有出现的save方法中传递用户,因为我使用的是 django-rest-framework

这是我的代码:

def save(self, *args, **kwargs):
    order = super(Order, self).save(*args, **kwargs)
    try:
        json_object = serializers.serialize('json', [ order, ])
        # I want to log the current user too.
        OrderLog.objects.create(order = order, object = json_object)
    except Exception as e:
        print e
    return order

2 个答案:

答案 0 :(得分:2)

可以获得当前用户。你必须为它实现自己的小型中间件。

您需要以下方法和中间件类。

您的中间件文件

from threading import local

_thread_locals = local()

def get_current_user():
    return getattr(_thread_locals, 'user', None)

class ThreadLocals( object ):
    """Middleware that gets various objects from the request object and saves them in thread local storage."""
    def process_request( self, request ):
    _thread_locals.user = getattr( request, 'user', None )

<强> Settings.py

MIDDLEWARE_CLASSES += (
    "your.path.to.middleware.ThreadLocals"
)

您的保存方法有些

save(self):
    from your.path.to.middleware import get_current_user

    user = get_current_user()

答案 1 :(得分:-1)

由于模型独立存在,因此无法让用户在模型的保存方法中执行请求。
您可以随意调用保存方法,即使根本没有请求也是如此。

因此,您需要将用户传递给每个保存调用,或者在调用save之前/之后需要登录调用save的函数。