1

我有一个这样的资源树结构:

Root
|
|
\-- Article
|     |
|     \-- 1
|     \-- 2
|
\-- User
      |
      \-- 1
      \-- 2

当用户访问“/Article”时,我将显示所有文章的列表:

@view_config(context='resource.ArticleDispatcher', renderer='nothing-related')
def article_list(context, resource):
    articles = request.db.query(Article)
    return {'articles': articles}

但是在模板中,我发现我无法调用“req.resource_url(ARTICLE_OBJECT)”,因为我从数据库中检索到的对象“文章”既没有名称也没有集。

现在我不知道如何在这种情况下生成 URL ... :-( 我的设计不正确吗?

4

1 回答 1

3

为了让您的 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}
于 2013-03-02T21:19:00.703 回答