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.postpostobj.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 待整理..

获取 django 应用的绝对路径

Django 获取绝对 URL

如何从 django 视图中的绝对 url 获取相对 url?

如何从 Django QuerySet 中获取绝对图像 URL 列表?

python Django:在视图中获取绝对URL(用于图像)