2013-07-25 4 views
15

템플릿에 절대 URL을 가져오고 싶습니다. 나는 URL로 할 수 없다. 그것은 상대 URL을 제공합니다.Django 절대 URL 가져 오기

http://domain.tld/article/post 

을하지만 장고 내가 settings.py 연주하지만 그것은 작동하지 않았다 단지

/article/post 

나에게주는 :이를 얻을 필요가있다.

템플릿 코드 (디버그 = 거짓, 호스트 대 허용) :

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

중복 가능성을 http://stackoverflow.com/questions/3994060/django- ([GET \ _absolute \ _url 전체 URL을 장고] full-url-in-get-absolute-url) – karthikr

+0

https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.build_absolute_uri 이렇게하면 도움이 될 것입니다. –

답변

7

장고와 오랜 만남 끝에 많은 것을 배웠습니다. 이 문제를 해결하기 위해 절대 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

감사합니다. 새로 추가 된 templatetag을로드하려면 django dev server를 다시 시작하십시오. –

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.postpostobj.url에 액세스하십시오.

+0

어디에 둘까요? 질문과 견해를 추가했습니다. 도와 줄수있으세요? 나는 2 일 동안 그것을 일하고있다 : S 그리고 나는 for 루프에서 그것을 사용하고있다. –

+0

좋아요, 당신의 views.py에 기반한 코드 예제로 답을 편집했습니다. 다른주의 사항 :'filter()'는'DoesNotExist' 예외를 발생시키지 않습니다. 그냥 빈리스트를 반환합니다; 'get()'_does_는'DoesNotExist' 예외를 발생 시키므로'Detail' 뷰에서 그것을 검사해야합니다. –