Django Get Absolute URL

2019-02-03 05:16发布

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条回答
Bombasti
2楼-- · 2019-02-03 05:58

This is easy to do in the view:

from django.core.urlresolvers import reverse

url = request.build_absolute_uri(reverse('blog:detail', args=[blog.slug]))

If you need to do it in the template, you can probably create your own template tag without too much trouble.

Edit

Assuming that you want to do this in your Home view, you could do something like this:

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.

查看更多
老娘就宠你
3楼-- · 2019-02-03 06:16

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',
)
查看更多
登录 后发表回答