Django在视图中获取静态文件URL


133

我正在使用reportlab pdfgen创建PDF。在PDF中,有一个由创建的图像drawImage。为此,我要么需要图像的URL,要么在视图中需要图像的路径。我设法建立了URL,但是如何获取图像的本地路径?

我如何获得网址:

prefix = 'https://' if request.is_secure() else 'http://'
image_url = prefix + request.get_host() + STATIC_URL + "images/logo_80.png"

Answers:


286

由于这是Google上的最佳结果,我想我应该添加另一种方法来做到这一点。我个人比较喜欢这一点,因为它将实现留给了Django框架。

# Original answer said:
# from django.templatetags.static import static
# Improved answer (thanks @Kenial, see below)
from django.contrib.staticfiles.templatetags.staticfiles import static

url = static('x.jpg')
# url now contains '/static/x.jpg', assuming a static path of '/static/'

2
您是否知道是否有一种将主机名添加到静态url的简单方法(如果STATIC_URL中不存在)?我需要在邮件中添加图像或其他资源,否则用户将无法找到带有相对URL的资源。
gepatino

3
在Debug中运行时,这对我不起作用(尚未尝试使用DEBUG = False)。我只是简单地将路径传递到返回的静态方法中。使用Django 1.6。有什么想法吗?
肖恩

我认为使用django.contrib.staticfiles.templatetags.staticfiles的代码应该更受欢迎,因为它与django-storages等兼容。
jdcaballerov

@gepatino您可以借道结果request.build_absolute_uri如下所述:stackoverflow.com/questions/2345708/...
dyve

17
在Django 2.0中,这将显示弃用通知。使用from django.templatetags.static import static代替。
Flimm

86

dyve的答案很不错,但是,如果您在django项目上使用“缓存的存储”,并且静态文件的最终url路径应变为“哈希”(例如,来自style.css的style.aaddd9d8d8d7.css),那么您无法使用获取精确的网址django.templatetags.static.static()。相反,您必须使用from的模板标记django.contrib.staticfiles来获取哈希网址。

此外,在使用开发服务器的情况下,此模板标记方法将返回未哈希的url,因此无论使用的是开发主机还是生产主机,都可以使用此代码!:)

from django.contrib.staticfiles.templatetags.staticfiles import static

# 'css/style.css' file should exist in static path. otherwise, error will occur 
url = static('css/style.css')

1
谢谢。。。花了我一段时间才弄清楚为什么我没有注入md5哈希值
ilovett 2014年

4
这个答案仍然很受欢迎,并得到了积极的使用,因此我以@Kenial的学分提高了我接受的答案。这仍然是此问题的首选解决方案。
dyve

12

这是另一种方式!(在Django 1.6上测试)

from django.contrib.staticfiles.storage import staticfiles_storage
staticfiles_storage.url(path)

好的解决方案,因为如果DEBUG设置为False,它将返回哈希URL。(可选)这样强制使用哈希网址: staticfiles_storage.url(path, force=True)
Marc Gibbons,

7

使用默认static标签:

from django.templatetags.static import static
static('favicon.ico')

中有另一个标记django.contrib.staticfiles.templatetags.staticfiles(如已接受的答案所示),但在Django 2.0+中已弃用。


6

从Django 3.0开始,您应该使用from django.templatetags.static import static

from django.templatetags.static import static

...

img_url = static('images/logo_80.png')

5

@dyve的答案在开发服务器中对我不起作用。相反,我用解决了find。这是函数:

from django.conf import settings
from django.contrib.staticfiles.finders import find
from django.templatetags.static import static

def get_static(path):
    if settings.DEBUG:
        return find(path)
    else:
        return static(path)

1

如果要获取绝对URL(包括协议,主机和端口),则可以使用request.build_absolute_uri如下所示的函数:

from django.contrib.staticfiles.storage import staticfiles_storage
self.request.build_absolute_uri(staticfiles_storage.url('my-static-image.png'))
# 'http://localhost:8000/static/my-static-image.png'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.