这是一个模板过滤器,直到工作没有问题 最近,在我更新Django源之前:
from pm_core.models import PMUser
@register.filter
def can_manage_market(user, market):
if not isinstance(user, PMUser): return False
return user.can_manage_market(market)
过滤器始终开始返回false。问题似乎是 'user'实例是'SimpleLazyObject'而不是PMUser(a 用户的子类)。在互联网上搜索它带我到 机票#12049,表明这可能是一个类似的错误 (不幸的是,那里提供的补丁没有补救措施)。
我很欣赏以前我没有意识到的关于这个简单对象的任何信息。
PS。我也把这个问题发给了django-users组,但还没有收到答案。
答案 0 :(得分:2)
正如彼得所说,这是由于Changeset 11626.这就是为什么现在给你一个包装器而不是对象的原因是因为该包装器对象的“懒惰”。它的设计使得如果你实际上没有对它做任何事情,它永远不会得到底层的User对象 - 这是出于缓存优化的原因。由于你所做的只是检查类型,并且不评估对象,它仍然是一个LazyObject,你的测试失败了。
不是检查对象是否是特定类型,而不是Pythonic,您应该检查您的对象是否具有您要调用的方法或属性。包装器应透明地传递它们,现在您的测试将成功。
try:
return user.can_manage_market(market)
except AttributeError:
return False
答案 1 :(得分:1)
答案 2 :(得分:0)
Changeset 11626(几天前检查过)将django.core.context_processors中的'user'定义从ContextLazyObject更改为SimpleLazyObject。我的咖啡还没有完全开始,但看起来这可能是你问题的根源。您可能需要在此处放置一个包装器或更改您的测试。