使用request.user创建对象会产生不可预测的结果

时间:2012-12-24 19:55:34

标签: django

我有一个名为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}}

0 个答案:

没有答案