为了让您的 Article 对象自动正确插入到遍历树中,最直接的方法是通过 parent 的__getitem__
方法访问它们,如果您正在访问单个文章,这将工作得很好:/Articles/123
当您显示列表时,您并没有真正遍历到单个文章,您希望在 处显示文章列表只是一个巧合/Articles
,因此这种情况不直接被遍历覆盖(这是关于遍历 URI) . 有一些快速修复可以使它看起来像遍历:
@view_config(context='resource.ArticleDispatcher')
def article_list(context, request):
all_articles_ids = context.magically_get_ids_of_all_articles()
articles = [context[id] for id in all_articles_ids]
return {'articles': articles}
在这里,您以某种方式知道您需要的所有文章的所有 id,并且只需通过遍历将子代插入到遍历上下文中。在许多情况下(尤其是使用 SQL 后端),这不会很有效,因为您需要为每个对象发出单独的查询。
二、更现实的例子:手动将文章插入到遍历上下文中:
@view_config(context='resource.ArticleDispatcher')
def article_list(context, request):
articles = context.adopt_children(request.db.query(Article))
return {'articles': articles}
class ArticleDispatcher(object):
def adopt_children(self, children):
for child in children:
child.__name__ = child.id # actually I'd made __name__ a property of the Article model
child.__parent__ = self
return children
第三个例子:不要假装你正在浏览文章,只需做类似的事情
req.resource_url(ARTICLE_DISPATCHER) + '/' + article.id
在这种情况下,您甚至可能不需要查询完整的 Article 对象,您可能只需要查询 name 和 id(在某些情况下可能会更快):
@view_config(context='resource.ArticleDispatcher')
def article_list(context, resource):
name_id_tuples = request.db.query(Article.id, Article.name).all()
return {'articles': name_id_tuples}