尝试在模板中循环遍历SimpleLazyObject会引发错误

时间:2016-01-06 21:48:13

标签: python django lazy-evaluation

我创建了一个模板上下文处理器,用于在每个页面上查询数据库以查找任何全局通知。我正在使用SimpleLazyObject向模板提供结果,这是必要的,因为所讨论的函数最终取决于来自不同模板上下文处理器的另一个SimpleLazyObject。这是功能:

def company_notifications(request):
    def get_notifications():
        from app.services.companies import CompanyNotificationService
        notifications = CompanyNotificationService().company_notifications(request.profile.company)
        return notifications

    return {
        'notifications': SimpleLazyObject(get_notifications),
    }

当我尝试循环模板中的notifications变量(即for notification in notifications)时,出现以下错误:

  

类型为'SimpleLazyObject'的/ staff / notifications对象的TypeError   没有len()

如果我只是尝试使用{{ notifications }}将变量打印到模板,我会得到我期望的结果:

[<CompanyNotification: 57>, <CompanyNotification: 55>, <CompanyNotification: 59>]

但如果我尝试打印其中一个对象的属性,即{{ notifications[0].headline }},我会收到一个新错误:

  

/ staff / notifications上的TemplateSyntaxError   无法解析余数:'[0] .headline'来自'notifications [0] .headline'

如何在模板中访问此变量?

1 个答案:

答案 0 :(得分:0)

@Alasdair的评论是正确的。这是Django中的一个错误&lt; 1.7。我的hacky解决方案是继承SimpleLazyObject:

class SimpleLazyObjectFix(SimpleLazyObject):
    def __len__(self, *args, **kwargs):
        return 1