Django получить абсолютный URL

Я хочу получить абсолютный url в шаблонах. Я не могу сделать с url. Это дает мне относительный URL. Мне нужно получить это:

http://domain.tld/article/post

но Джанго дает мне просто

/article/post

я играл с settings.py но это не сработало. (debug=false, разрешенные хосты против)

код шаблона:

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

2 ответов


это легко сделать в виде:

from django.core.urlresolvers import reverse

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

Если вам нужно сделать это в шаблоне, вы можете создать свой собственный тег шаблона без особых проблем.

редактировать

предполагая, что вы хотите сделать это в ваш Home view, вы можете сделать что-то вроде этого:

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)

затем в вашем шаблоне, пока вы зацикливаетесь с {% for postobj in posts %} вы можете получить доступ к postobj.post и postobj.url.


после долгой встречи с Джанго я узнал много вещей. Для этой проблемы я создал абсолютный url templatetag.

добавьте это в теги шаблона, а затем используйте как url-адрес по умолчанию:

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

вот суть абсолютного url templatetag, вам нужно будет добавить объект запроса в template_context_processors, иначе это не сработает. Чтобы достичь этого, откройте settings.py и добавьте следующие строки:

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