0

我有一个模型,其外键到用户名为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.userLogger

似乎一切正常。然后,我在应用程序中注册为新用户,并在设置密码和身份验证后,作为最近注册的用户触发了此代码。在这种情况下导致的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)
4

0 回答 0