所以我有点挣扎,有些东西在逻辑上看起来很简单但是由于我对Django的理解有限,我不知道在哪里看以及如何制定解决方案。
基本上我有一个Blog应用程序设置,它在主页上显示完整的(所有内容包括disqus讨论)最新帖子。该帖子还有一个链接到帖子自己的页面。我设置了Disqus,需要获取一些用于disqus_url
和disqus_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,但我不确定如何实际使用它来获得我想要的东西。
由于
答案 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
下的TEMPLATES
,OPTIONS
。
然后在模板中:
<a href="{{ BASE_URL }}{{ obj.get_absolute_url }}">Object Name</a>
另一个解决方案是使用request.build_absolute_uri(location)
,但是您必须创建一个模板标记,该标记采用request
对象和location
或具有{{1}的对象} 方法。然后你就可以使用它那样的模板:get_absolute_uri
。以下是关于如何编写自定义标记的documentation。