20

What I'd like to do (for a recent changes 'widget' - not a django widget in this case) is pass a urlname into my template as a variable, then use it like so: {% url sitechangeobject.urlname %} Where urlname is a string containing a valid name for a url.

Is this possible? The template keeps breaking saying it can't find sitechangeobject.urlname as a name (which is quite right, it doesn't exist). Is there any way to make it look inside that variable?

There are other ways to solve this problem if not, just thought I'd check though.

Thanks!

5 Answers5

30

As of Django 1.3 the {% url %} tag properly supports:

{% url view_name_variable %}
{% url 'view_name_string' %}

...this becomes the default behaviour in Django 1.5.

Previously, you had only the option to do this:

{% url view_name_string %}

To get the tag to work in this way in Django 1.3 and 1.4 projects, you will need the following line to the top of every template you use it in:

{% load url from future %}

According to the Django 1.3 release notes:

...in Django 1.5, the old behavior will be replaced with the new behavior. To ensure compatibility with future versions of Django, existing templates should be modified to use the new future libraries and syntax.

Note that support for {% load url from future %} has been removed in Django 1.9.

meshy
  • 8,470
  • 9
  • 51
  • 73
  • How would a variable be concatenated to a suffix string to form the url? Something like `{% url variable-'suffix' %}`,which of course does not work. – Romildo Jul 21 '12 at 02:59
  • 2
    Seems a little odd to me, but I think you could use the `|add` filter. ie: `{% url variable|add:'-suffix' %}` See the [add filter docs](https://docs.djangoproject.com/en/1.4/ref/templates/builtins/?from=olddocs#add). – meshy Jul 23 '12 at 11:18
8

Note: this answer is only really relevant to versions of django before 1.3. If you are using django 1.3 or later, the required functionality is built-in - please see meshy's answer.

The built-in url tag cannot do this. However django-reversetag does exactly this (and more).

According to the readme, the reverse tag provided by this code provides:

  • Consistent syntax ("string literals" and variables)
  • Ability to reverse view names stored in context variables
  • Partial reversing
Community
  • 1
  • 1
msanders
  • 5,739
  • 1
  • 29
  • 30
4

for django 1.5 may be this is useful

usually, to access a variable passed from view we use

{{variable}}

however, for url in template, the following does not work:

{% url 'app:namespace' {{varible}} %}

simply use the following is fine:

{% url 'app:namespace' varible %}
Samsul Islam
  • 2,581
  • 2
  • 17
  • 23
user2673206
  • 215
  • 2
  • 12
1

if you are using Django 1.5 and up, django-reversetags is not required anymore for just passing view names as variables into templates, to be used within the url tag.

I was confused with the availability of django-reversetags, just thought of updating the matter correctly here.

binithb
  • 1,910
  • 4
  • 23
  • 44
0

In template ---->
{% url 'app_name:urlName' arg1=value arg2=value %}

In app url ---->

url(r'^goto/(?P<arg1>[0-9A-Za-z_\-]+)/(?P<arg2>[0-9A-Za-z]{1,13}])/', ViewName, name='urlName'),

In project Url---->

path('v1/to_app/', include(('app_name.urls','app_name'),namespace="app_name")),

This will help...!

Samsul Islam
  • 2,581
  • 2
  • 17
  • 23
Sandeep
  • 1
  • 2