15

I want to get absolute url in templates. I can't do with url. It gives me a relative URL. I need to get this:

http://domain.tld/article/post 

but Django gives me just

/article/post 

I played with settings.py but it didn't work. (debug=false, allowed hosts vs.)

Template code:

{% url 'blog:detail' blog.slug %} 
2

2 Answers 2

31

This is easy to do in a view. For example:

from django.core.urlresolvers import reverse def Home(request): posts = Article.objects.filter(published=True).order_by('-publish') site = Site.objects.get_current() c = RequestContext(request, { 'posts': [{'post': post, 'url': request.build_absolute_uri(reverse('blog:detail', args=[post.slug]))} for post in posts] 'site': site, }) return render_to_response('templates/index.html', c) 

Then, in your template, while you're looping with {% for postobj in posts %} you can access postobj.post and postobj.url.

If you want to do this in the template instead you can probably create your own template tag without too much trouble.

Sign up to request clarification or add additional context in comments.

2 Comments

Where to place it? I added the views and models to question. Can you help me please? I'm working it for 2 days :S And I'm using it in for loop.
OK, I edited the answer with a code example based on your views.py. Some other notes: filter() doesn't raise a DoesNotExist exception, it just returns an empty list; but get() does raise a DoesNotExist exception so you should check for it in your Detail view.
7

After a long time meeting with Django, I learned a lot of things. For this issue, I created an absolute URL templatetag.

Add this to your template tags, then use like default url tag:

{% absurl 'some-view' with, arguments %}

Here is the Gist for the absolute URL templatetag, you will need to add request object to template_context_processors, otherwise this will not work. To achieve this, open your settings.py and add these following lines:

from django.conf import global_settings TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + ( 'django.core.context_processors.request', ) 

2 Comments

You may also need to load the template tag, e.g. assuming the file is named absurl.py then you'd add {% load absurl %} to the top of your template
Neat solution, thanks. Remember to restart django dev server to load the newly added templatetag.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.