Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

webapp2 - How to reverse URL in templates?

I'm starting with webapp2. My english is not very good, so i'll use an example to explain my problem: Suppose i'm building an application that will handle cars information.

I've these handlers:

  • ViewHandler: will display a view for a single car, with all of its information (engine, year, brand, model, etc..)
  • ListHandler: will display all the cars in the application, with a link to the view page.

The problem is that i can't build that link to the single view.

I could do this in the template:

<ul> 
  <li><a href='/cars/view/{{car.id}}'>{{car.model}}</a></li> 
</ul> 

but don't like that (where's the DRY principle after all?) I was wondering if there's some way to do it similar to django, resolving the URL in the template, like this:

<ul> 
  <li><a href='{% url cars.view car.id}'>{{car.model}}</a></li> 
</ul> 

Maybe it's not in the template. I've tryed webapp2.url_for() but didn't help.

Thanks a lot!

like image 219
santiagobasulto Avatar asked Jan 13 '12 15:01

santiagobasulto


1 Answers

webapp2.uri_for() is your best bet, but you must use it in combination with named routing. You can read more about webapp2 routing in combination with uri_for here: http://webapp-improved.appspot.com/guide/routing.html

Here's an example from the above article of how it might look:

app = webapp2.WSGIApplication([
    webapp2.Route('/', handler='handlers.HomeHandler', name='home'),
    webapp2.Route('/wiki', handler=WikiHandler, name='wiki'),
    webapp2.Route('/wiki/<page>', handler=WikiHandler, name='wiki-page'),
])

# /
uri = uri_for('home')

# http://localhost:8080/
uri = uri_for('home', _full=True)

# /wiki
uri = uri_for('wiki')

# http://localhost:8080/wiki
uri = uri_for('wiki', _full=True)

# http://localhost:8080/wiki#my-heading
uri = uri_for('wiki', _full=True, _fragment='my-heading')

# /wiki/my-first-page
uri = uri_for('wiki-page', page='my-first-page')

# /wiki/my-first-page?format=atom
uri = uri_for('wiki-page', page='my-first-page', format='atom')
like image 96
Aneon Avatar answered Oct 03 '22 00:10

Aneon