如何在使用Traversal时生成要查看的URL?

时间:2013-02-26 13:52:40

标签: python pyramid traversal

使用URL Dispatch时,我们可以轻松生成视图的URL,因为每个视图都有一个不同的route_name,如:

login.py:
@view_config(route_name='login')

index.pt:
<a href="${request.route_url('login')}">Login</a>

但是如何在遍历中执行此操作?由于没有资源“登录”可用的实例,我不知道如何生成URL以查看登录。

2 个答案:

答案 0 :(得分:8)

在遍历中,您需要知道树的结构,并且必须能够按需加载上下文对象。网址是根据上下文生成的,使用其位置感知属性__name____parent__来构建网址。

/
|- login
|- users
   |- 1
      |- edit

所以假设我们有一个User(id=1)上下文对象,我们想登录。如果您的观点是通过@view_config(context=Root, name='login')注册的,那么您可以通过request.resource_url(request.root, 'login')生成网址。这是我们告诉Pyramid生成相对于树根的URL。

另一方面,如果我们处于登录状态并且我们想要让用户进行编辑,则必须为该用户加载位置感知User对象才能生成URL。 request.resource_url(user, 'edit')其中user是具有有效User(id=1)__name__属性的__parent__个实例。

如果您传入的内容没有位置感知__parent__,则会生成一个URL,就像您的用户已安装在/一样,因为这是Pyramid认为该对象的唯一理智之处在你的树上。

加载位置感知对象的能力是我们强调遍历最适合使用持久性对象树的原因,而不是动态生成的对象。如果您想为其生成网址,直接加载用户并为其填充__parent____name__会更加方便。

答案 1 :(得分:1)

resource_url(资源,'view_name')