如何在Django模板中使用域get_absolute_url?

时间:2014-06-22 15:32:01

标签: django

所以我有点挣扎,有些东西在逻辑上看起来很简单但是由于我对Django的理解有限,我不知道在哪里看以及如何制定解决方案。

基本上我有一个Blog应用程序设置,它在主页上显示完整的(所有内容包括disqus讨论)最新帖子。该帖子还有一个链接到帖子自己的页面。我设置了Disqus,需要获取一些用于disqus_urldisqus_identifier的关键信息。我已使用get_absolute_url的方法如下设置模型,如下所示:

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

我的观点设置如下:

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)

正如您所见,视图已设置为按以下方式处理两个网址:

    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

我不喜欢以一种黑客的方式做事,对我来说,获得完整绝对网址的最佳方法是什么。我查看了request.get_absolute_uri,但我不确定如何实际使用它来获得我想要的东西。

由于

1 个答案:

答案 0 :(得分:8)

我喜欢这样做的方法是配置context_processor

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("/")
     }
settings.py中的

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

(在较新版本的Django中,请修改context_processors下的TEMPLATESOPTIONS

然后在模板中:

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

另一个解决方案是使用request.build_absolute_uri(location),但是您必须创建一个模板标记,该标记采用request对象和location或具有{{1}的对象} 方法。然后你就可以使用它那样的模板:get_absolute_uri。以下是关于如何编写自定义标记的documentation