2014-06-22 1 views
3

그래서 약간 논쟁이 있습니다. 논리적으로는 너무 단순 해 보이지만, 장고에 대한 제한된 이해로 어디서 볼 것인지, 솔루션을 공식화하는 방법을 모르겠습니다.Django 템플릿에서 도메인으로 get_absolute_url하는 방법은 무엇입니까?

기본적으로 블로그 앱을 설정하고 홈 페이지에 전체 게시물 (disqus 토론을 포함한 모든 콘텐츠) 최신 게시물을 표시합니다. 게시물에는 게시물 자체 페이지에 대한 추가 링크가 있습니다. Disqus를 설정하고 disqus_urldisqus_identifier에 사용할 핵심 정보를 얻을 필요가 있습니다.

def renderBlog(request,postid=1,slug=None): 
    template = 'blog_home.html' 

    if(postid == 1 and slug == None): 
     post = Post.objects.latest('date_created') 
    else: 
     post = Post.objects.get(slug=slug, id=postid) 

    data = { 
      'post':post, 
     } 

    return render(request, template, data) 

당신이보기가 모두 처리하도록 설정되어 볼 수 있듯이 다음과 같이

def get_absolute_url(self): 
    return reverse('blog.views.renderBlog',args=[str(self.id),str(self.slug)]) 

내보기를 설정 한 다음과 같이 다음과 같이 나는 get_absolute_url하는 방법과 모델을 설정 한 URL의는 다음과 같습니다 내 템플릿에서

url(r'^$', 'renderBlog', name='blogHome'), 
    url(r'^post/(?P<postid>\d{1,4})/(?P<slug>[\w-]+)/$', 'renderBlog', name='blogPostPage'), 

나는 disqus_identifier = '{{ post.get_absolute_url }}'을 설정, 그리고 난 disqus_url = 'http://127.0.0.1{{ post.get_absolute_url }}';.로 그 동안의 도메인 부분을 하드 코딩하고 있습니다. 댓글 수 <a href="" data-disqus-identifier에 대해서도 마찬가지입니다.

해킹 된 방식으로 일을하는 것을 좋아하지 않으며, 완전한 절대 URL을 얻는 가장 좋은 방법은 무엇입니까? 나는 request.get_absolute_uri를 보았지만, 실제로 그것을 사용하여 원하는 것을 얻는 방법에 대해서는 확신하지 못했습니다.

감사

답변

7

내가하고 싶은 방법 그것이 context_processor 구성입니다 : settings.py에서

from django.contrib.sites.models import Site 

def base_context_processor(request): 
    return { 
     'BASE_URL': "http://%s" % Site.objects.get_current().domain 
    } 
    # or if you don't want to use 'sites' app 
    return { 
     'BASE_URL': request.build_absolute_uri("/").rstrip("/") 
    } 

: TEMPLATES에서 context_processors을 수정,

TEMPLATE_CONTEXT_PROCESSORS = (
    ... 
    'path.to.base_context_processor', 
    ... 
)  

(장고의 최신 버전에서를, 대신 OPTIONS)

템플릿에서 다음

는 :

<a href="{{ BASE_URL }}{{ obj.get_absolute_url }}">Object Name</a> 

또 다른 해결책은 request.build_absolute_uri(location)을 사용하는 것입니다,하지만 당신은 request 객체와 location 또는 get_absolute_uri 방법이있는 오브젝트를 템플릿 태그를 생성해야합니다. 그런 다음 템플릿을 사용할 수 있습니다 : {% get_full_uri request=request obj=post %}. 맞춤 태그를 작성하는 방법은 documentation입니다.

+3

이 'BASE_URL'은 https 사이트 또는 포트 구성 요소가있는 URL에서 작동하지 않습니다. ''BASE_URL ': request.build_absolute_uri ("/"). rstrip ("/")'을 사용하는 것이 더 좋으며, 모든 상황을 올바르게 처리 할 수 ​​있습니다. –

+0

https와 http를 모두 사용하는 경우 다음과 같이이 스키마를 생략하면됩니다 :''BASE_URL ': "// % s"% request.get_host()' –

+0

문맥에 따라, 절대 URL (즉, 그것이 scheme-relative가되기 때문에). –

관련 문제