2013-07-25 3 views
15

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

http://domain.tld/article/post 

но Django дает мне только

/article/post 

Я играл с settings.py, но это не сработало. (Отлаживать = ложь, позволило хозяевам VS.) код

шаблона:

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

возможный дубликат [Джанго полный URL в прибудете \ _absolute \ _url] (http://stackoverflow.com/questions/3994060/django- full-url-in-get-absolute-url) – karthikr

+0

https://docs.djangoproject.com/ru/dev/ref/request-response/#django.http.HttpRequest.build_absolute_uri Это может вам помочь. –

ответ

7

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

Добавить это теги шаблона, а затем использовать как URL по умолчанию тег:

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

Here is the Gist for the absolute 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', 
) 
+0

Вам также может потребоваться загрузить тег шаблона, например. предполагая, что файл называется 'absurl.py', вы должны добавить' {% load absurl%} 'в начало вашего шаблона –

+0

Удовлетворительное решение, спасибо. Не забудьте перезапустить сервер django dev для загрузки недавно добавленного templatetag. –

29

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

from django.core.urlresolvers import reverse 

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

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

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

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

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.

+0

Где его разместить? Я добавил взгляды и модели на вопрос. Не могли бы вы мне помочь? Я работаю в течение 2 дней: S И я использую его для цикла. –

+0

ОК, я отредактировал ответ с примером кода на основе ваших views.py. Некоторые другие примечания: 'filter()' не вызывает исключение 'DoNotExist', он просто возвращает пустой список; но 'get()' _does_ вызывает исключение 'DoNotExist', поэтому вы должны проверить его в своем представлении' Detail'. –

Смежные вопросы