问题
When URL Dispatch is used, we can easily generate a URL to a view because every view has a distinct route_name like:
login.py:
@view_config(route_name='login')
index.pt:
<a href="${request.route_url('login')}">Login</a>
But how to do this in traversal? Since there is no instance of resources 'Login' available, I don't know how to generate URL to view login.
回答1:
In traversal you are required to know the structure of your tree, and you must be able to load context objects on demand. The URLs are generated with respect to a context, using its location-aware properties __name__
and __parent__
to build the URL.
/
|- login
|- users
|- 1
|- edit
So let's say we have a User(id=1)
context object, and we want to login. If your view is registered via @view_config(context=Root, name='login')
, then you can generate the url via request.resource_url(request.root, 'login')
. This is us telling Pyramid to generate a URL relative to the root of the tree.
On the other hand, if we are at login and we want to take the user to edit you must load a location-aware User
object for that user in order to generate the URL. request.resource_url(user, 'edit')
where user
is an instance of User(id=1)
with valid __name__
and __parent__
attributes.
If you pass in a context without a location-aware __parent__
the URL will be generated as if your user was mounted at /
because that's the only sane place for Pyramid to think the object would be in your tree.
The ability to load a location-aware object is why we stress that traversal works best with a persistent tree of objects, not one that is generated on the fly. It's much more convenient to directly load the user and have its __parent__
and __name__
already populated for you if you want to generate URLs for it.
回答2:
resource_url(resource, 'view_name')
来源:https://stackoverflow.com/questions/15090863/how-to-generate-url-to-view-when-using-traversal