在Django中,当我使用:
{{ request.build_absolute_uri }}{% static "img/myimage.jpg" %}
它产生:' http://myurl.com//static/img/myimage.jpg'。这会产生错误。
如何删除双斜杠?
STATIC URL是:
STATIC_URL = '/static/'
但我不认为删除第一个' /'会是一个好主意。
答案 0 :(得分:12)
build_absolute_uri
方法为当前页面构建绝对uri。这意味着,如果您正在进行,例如' http://myurl.com/login/',生成的完整网址将是' http://myurl.com/login//static/img/myimage.jpg'。
相反,使用request.get_host()
(可选地与request.scheme
一起用于网址方案),或者最好使用sites framework将模板变量设置为当前网站域。关于代理,get_host()
方法有some issues。
get_host()
方法将返回当前域,而不附加路径。
答案 1 :(得分:3)
request
对象在模板中可用,并且您可以轻松访问request.scheme
或request.META.HTTP_HOST
之类的属性来构造基本URL,可以在静态URL之前添加基本URL,以获取完整的网址。
最终示例如下所示:
<img src="{{request.scheme}}://{{request.META.HTTP_HOST}}{% static 'img/myimage.jpg' %}">
答案 2 :(得分:2)
我刚刚制作了一个快速模板标签。创建文件/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。
答案 3 :(得分:0)
这值得更新吗(Django 2+)?
这对我特别有帮助,因为我试图在链接中添加查询,即myimage.jpg实际上是从数据库中提取的。我需要一种将其放入src的方法,该方法是用{{img_link_field_in_model}}替换'myimage.jpg'。
<img src="{% get_static_prefix %}img/myimage.jpg">
将产生:
<img src="/static/img/myimage.jpg">
查询示例为:
<img src="{% get_static_prefix %}img/{{img_link_from_model}}">
答案 4 :(得分:-2)
不完全确定您要问的是什么,但由于{%static ..%}只是将/ static /添加到您指定的路径的前面,您可以自己执行此操作:
{{ request.build_absolute_uri }}static/img/myimage.jpg
不是非常模块化,但是大多数情况下您不需要直接访问完整的网址,因为如果您将其用作某个html的src,它会将其附加到您正在使用的任何网址上对象
答案 5 :(得分:-4)
build_absolute_uri
将位置作为处理双斜杠问题的参数。
不幸的是,你不能通过django模板语言传递参数。
您需要构建一个自定义模板标记或过滤器,它接受build_absolute_uri
函数的参数。
我更喜欢Jinja的原因之一就是我可以做到这一点:
{{ request.build_absolute_uri(static('img/foo.png')) }}