How to generate urls in django
-
09-06-2019 - |
Question
In Django's template language, you can use {% url [viewname] [args] %}
to generate a URL to a specific view with parameters. How can you programatically do the same in Python code?
What I need is to create a list of menu items where each item has name, URL, and an active flag (whether it's the current page or not). This is because it will be a lot cleaner to do this in Python than the template language.
Solution
If you need to use something similar to the {% url %}
template tag in your code, Django provides the django.core.urlresolvers.reverse()
. The reverse
function has the following signature:
reverse(viewname, urlconf=None, args=None, kwargs=None)
OTHER TIPS
I'm using two different approaches in my models.py
. The first is the permalink
decorator:
from django.db.models import permalink
def get_absolute_url(self):
"""Construct the absolute URL for this Item."""
return ('project.app.views.view_name', [str(self.id)])
get_absolute_url = permalink(get_absolute_url)
You can also call reverse
directly:
from django.core.urlresolvers import reverse
def get_absolute_url(self):
"""Construct the absolute URL for this Item."""
return reverse('project.app.views.view_name', None, [str(self.id)])
Be aware that using reverse()
requires that your urlconf module is 100% error free and can be processed - iow no ViewDoesNotExist
errors or so, or you get the dreaded NoReverseMatch
exception (errors in templates usually fail silently resulting in None
).