在Django中,我使用时:
{{ request.build_absolute_uri }}{% static "img/myimage.jpg" %}
它产生:'http://myurl.com//static/img/myimage.jpg'。这会产生错误。
如何删除双斜线?
STATIC URL是:
STATIC_URL = '/static/'
但我不认为删除第一个'/'是个好主意。
build_absolute_uri
方法为当前页面构建绝对uri。这意味着,如果你在'http://myurl.com/login/',结果完整的网址将是'http://myurl.com/login//static/img/myimage.jpg'。
相反,使用request.get_host()
(可选地与request.scheme
一起用于url方案),或者优选地,使用sites framework将模板变量设置为当前站点域。 get_host()
方法有关于代理的some issues。
get_host()
方法将返回当前域而不附加路径。
我刚刚为此做了一个快速模板标签。创建文件/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。
request
对象在模板中可用,您可以轻松访问request.scheme
或request.META.HTTP_HOST
等属性,以构建您可以在静态URL之前添加的基本URL,以获取完整的URL。
最后的例子看起来像这样:
<img src="{{request.scheme}}://{{request.META.HTTP_HOST}}{% static 'img/myimage.jpg' %}">
不完全确定你在问什么,但由于{%static ..%}只是在你指定的路径前面添加/ static /,你可以自己做:
{{ request.build_absolute_uri }}static/img/myimage.jpg
不是非常模块化,但是大多数时候你不需要直接访问完整的url,因为如果你把它作为某个html对象的src用它,它会将它附加到你所在的url上。
build_absolute_uri
将该位置作为处理双斜线问题的参数。不幸的是,你不能通过django模板语言传递参数。
您需要构建一个自定义模板标记或过滤器,它接受build_absolute_uri
函数的参数。
我更喜欢Jinja的原因之一就是我可以做到这一点:
{{ request.build_absolute_uri(static('img/foo.png')) }}