Djangoは静的ファイルのURLを表示します


133

reportlab pdfgenを使用してPDFを作成しています。PDFには、によって作成された画像がありdrawImageます。そのためには、ビュー内の画像へのURLまたは画像へのパスが必要です。なんとかURLを作成できましたが、イメージへのローカルパスを取得するにはどうすればよいですか。

URLの取得方法:

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

回答:


287

これが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 2013

3
これは、Debugでの実行中は機能しません(DEBUG = Falseでまだ試していません)。静的メソッドに渡されたパスが返されるだけです。Django 1.6を使用します。何かご意見は?
ショーン

django.contrib.staticfiles.templatetags.staticfilesを使用するコードは、django-storagesなどと互換性があることを考慮に入れて選択する必要があると思います。
jdcaballerov 14

@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.asd9d8d8d7.cssからstyle.cssなど)、あなたはで正確なURLを取得できませんdjango.templatetags.static.static()。代わりに、django.contrib.staticfilesハッシュされたURLを取得するには、テンプレートタグfrom を使用する必要があります。

さらに、開発サーバーを使用する場合、このテンプレートタグメソッドはハッシュ化されていない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

4
この回答はまだヒットしており、積極的に使用されているので、@ Kenialへのクレジットを使用して、受け入れられた回答を改善しました。これはまだこの問題の推奨ソリューションです。
dyve、2015年

12

ここに別の方法があります!(Django 1.6でテスト済み)

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

DEBUGがFalseに設定されている場合、これはハッシュされたURLを返すため、適切なソリューションです。オプションのようなので、ハッシュされたURLを強制: staticfiles_storage.url(path, force=True)
マルク・ギボンズ

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'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.