这是一个模板过滤器,直到最近,在我更新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 (User的子类)。在互联网上搜索它,我找到了标签#12049,这表明这可能是一个类似的bug (然而,不幸的是,提供的补丁没有补救措施)。
如果有任何关于这个简单的aware的信息,我将不胜感激。
ps。我也把这个问题发到了django-users组,但是还没有收到回复。
发布于 2009-10-20 13:11:27
此问题已作为错误提交(票证#12060),并已被正式接受。感谢Peter和Daniel的帮助。
EDIT:该问题已在变更集11637中修复。
发布于 2009-10-19 18:40:06
正如Peter所说,这要归功于Changeset 11626。之所以现在给你一个包装器,而不是对象,是因为包装器对象的“惰性”。它的设计是这样的,如果你不实际使用它做任何事情,它永远不会获得底层的User对象--这是出于缓存优化的原因。因为您所做的只是检查类型,而不计算对象的值,所以它仍然是一个LazyObject,您的测试将失败。
您应该检查对象是否具有要调用的方法或属性,而不是检查对象是否属于特定类型。包装器应该透明地传递这些内容,现在您的测试将成功。
try:
return user.can_manage_market(market)
except AttributeError:
return False
发布于 2009-10-19 16:46:08
Changeset 11626 (几天前签到)将django.core.context_processors中的'user‘定义从ContextLazyObject更改为SimpleLazyObject。我的咖啡还没有完全发挥作用,但看起来这可能是你问题的根源。您可能需要对此进行包装,或者更改测试。
https://stackoverflow.com/questions/1589651
复制相似问题