我有一个模型,其外键到用户名为ActivityEntryItem
. 一个名为的类Logger
为创建这些模型提供了一个简化的接口。以下是一些摘录Logger
:
def __init__(self, organization=None, user=None):
result = super(Logger,self).__init__()
if user:
self.user = user
if organization:
self.organization = organization
return result
def log(self, **kwargs):
# Snip for the sake of brevity
kwargs_subset['user'] = self.user
entry = ActivityLogEntry.objects.create(**kwargs_subset)
user
使用 . 从视图传递到__init__
as 。request.user
Logger
似乎一切正常。然后,我在应用程序中注册为新用户,并在设置密码和身份验证后,作为最近注册的用户触发了此代码。在这种情况下导致的ActivityEntryItem
对象指向我之前登录的用户,而不是我在触发代码时登录的用户。
每次我重复这个过程(即邀请新用户、注册为受邀用户、触发代码)时,新创建的 ActivityLogEntry 引用的用户指向最后登录的用户,而不是实际登录的用户在。
我怀疑这与 request.user 在SimpleLazyObject
评估之前有关。所以,我改变了__init__
so callself.user.pk
之后self.user = user
。这似乎解决了这个问题。我还注意到重新启动服务器会使这个问题消失。
我怀疑这是 Django (1.4) 中的一个错误,但我想先在这里检查一下,看看是否有人对为什么会发生这种情况有任何想法。谢谢。
编辑:此 mixin 用于需要进行日志记录的视图中。这显示了记录器是如何实例化的,以及它最终是如何记录的。
class LoggerMixin(object):
def dispatch(self, request, *args, **kwargs):
self.logger = Logger(user=request.user)
return super(LoggerMixin, self).dispatch(request, *args, **kwargs)