Django 获取绝对 URL
Posted
技术标签:
【中文标题】Django 获取绝对 URL【英文标题】:Django Get Absolute URL 【发布时间】:2013-07-25 19:46:29 【问题描述】:我想在模板中获取绝对 url。我不能用网址做。它给了我一个相对的 URL。我需要得到这个:
http://domain.tld/article/post
但 Django 只给了我
/article/post
我玩过 settings.py 但它不起作用。 (debug=false,允许主机与)
模板代码:
% url 'blog:detail' blog.slug %
【问题讨论】:
django full url in get_absolute_url的可能重复 docs.djangoproject.com/en/dev/ref/request-response/… 这可能对你有帮助。 【参考方案1】:这在视图中很容易做到。例如:
from django.core.urlresolvers import reverse
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
。
如果您想在模板中执行此操作,您可以轻松创建自己的模板标签。
【讨论】:
放在哪里?我添加了要质疑的观点和模型。你能帮我吗?我正在工作 2 天:S 我在 for 循环中使用它。 好的,我根据您的 views.py 使用代码示例编辑了答案。其他一些注意事项:filter()
不会引发DoesNotExist
异常,它只是返回一个空列表;但是get()
确实会引发DoesNotExist
异常,因此您应该在Detail
视图中检查它。【参考方案2】:
在与 Django 长时间的交流之后,我学到了很多东西。对于这个问题,我创建了一个绝对 URL 模板标签。
将此添加到您的模板标签中,然后使用默认的 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',
)
【讨论】:
您可能还需要加载模板标签,例如假设文件名为absurl.py
,那么您将在模板顶部添加% load absurl %
完美的解决方案,谢谢。记得重启django dev server,加载新添加的templatetag。以上是关于Django 获取绝对 URL的主要内容,如果未能解决你的问题,请参考以下文章
如何从 django 视图中的绝对 url 获取相对 url?