2014-05-19 26 views
4

在Django中,当我使用:Django的获取绝对URL静态文件

{{ request.build_absolute_uri }}{% static "img/myimage.jpg" %} 

它产生: 'http://myurl.com//static/img/myimage.jpg'。这会产生一个错误。

如何删除双斜杠?

静态网址是:

STATIC_URL = '/static/' 

但我不认为除去第一“/”将是一个不错的主意。

+3

难道你不能简单地放弃'{%static“img/myimage.jpg”%}'?你真的需要'{{request.build_absolute_uri}}'吗? – janos

+3

我需要访问完整路径。 – cusejuice

回答

-2

不能完全确定你的要求,但由于{%静态..%}只添加/静态/到您指定路径的面前,你可能只是做自己:

{{ request.build_absolute_uri }}static/img/myimage.jpg 

不是非常模块化的,但是大多数时候你不需要直接访问完整的url,因为如果你将它用作某个html对象的src,它会将它附加到你所在的任何url上。

+0

他想知道如何删除第二个斜杠,大概没有绕过静态框架。 –

10

build_absolute_uri方法为当前页面构建绝对URI。这意味着如果你在等'http://myurl.com/login/',结果完整的url将是'http://myurl.com/login//static/img/myimage.jpg'。

取而代之的是,使用request.get_host()(可选地与request.scheme一起用于url方案),或者最好使用sites framework来为当前站点域设置模板变量。有关代理的get_host()方法有some issues

get_host()方法将返回没有附加路径的当前域。

+3

你能提供完整的例子吗? – Seio

+0

这是'scheme'和'get_host'的例子。 ''因为'//' – Vadorequest

-5

build_absolute_uri将位置作为处理双斜杠问题的参数。 不幸的是,你不能通过django模板语言传递参数。

您将需要构建一个自定义模板标记或过滤器,它接受build_absolute_uri函数的参数。

其中一个原因是多方面的,我更喜欢神社,因为我可以做这样的:

{{ request.build_absolute_uri(static('img/foo.png')) }} 
1

我只是做了一个快速模板标签这样做。创建文件/myapp/templatetags/__init__.py/myapp/templatetags/my_tag_library.py,如果没有它们了,并添加以下到my_tag_library.py

from django import template 
from django.templatetags import static 

register = template.Library() 

class FullStaticNode(static.StaticNode): 
    def url(self, context): 
     request = context['request'] 
     return request.build_absolute_uri(super().url(context)) 


@register.tag('fullstatic') 
def do_static(parser, token): 
    return FullStaticNode.handle_token(parser, token) 

然后在你的模板,只是{% load my_tag_library %}并使用如{% fullstatic my_image.jpg %}

为了回应以前的意见,为什么有人需要这样做,我的特殊使用案例是我想将一个静态文件链接到open graph protocol元标记中,并且这些链接必须是绝对的。在开发过程中,静态文件在本地提供,但在生产中它们被远程提供服务,所以我不能仅仅预先安装主机来获取完整的url。

+0

,所以无法使用'build_absolute_uri'工作,这正是我一直在寻找的。 – lmiguelvargasf