我有一个名为ActivityEntryItem
的用户的ForeignKey模型。名为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__
从request.user
作为Logger
传递到ActivityEntryItem
。
似乎一切都运转良好。然后,我在应用程序中注册为新用户,在设置密码并进行身份验证后,我将此代码作为最近注册的用户触发。导致此案例的SimpleLazyObject
对象指向我之前登录的用户,而不是我在触发代码时登录的用户。
每次重复此过程(即,邀请新用户,注册为受邀用户,触发代码)时,新创建的ActivityLogEntry引用的用户指向已登录的最后一个用户而不是用户那实际上已经登录了。
我怀疑这与request.user在被评估之前是__init__
有关。所以,我更改了self.user.pk
,因此请在self.user = user
后调用class LoggerMixin(object):
def dispatch(self, request, *args, **kwargs):
self.logger = Logger(user=request.user)
return super(LoggerMixin, self).dispatch(request, *args, **kwargs)
。这似乎解决了这个问题。我还注意到重启服务器会使这个问题消失。
我怀疑这是Django(1.4)中的一个错误,但我想先在这里查看,看看是否有人知道为什么会这样。感谢。
编辑:此mixin用于需要进行日志记录的视图中。这显示了如何实例化记录器,以及它最终如何记录。
{{1}}