Django mendapatkan URL file statis dalam tampilan

133

Saya menggunakan pdfgen reportlab untuk membuat PDF. Di PDF ada gambar yang dibuat oleh drawImage. Untuk ini saya perlu URL ke gambar atau path ke gambar dalam tampilan. Saya berhasil membangun URL tetapi bagaimana cara mendapatkan jalur lokal ke gambar?

Bagaimana saya mendapatkan URL:

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

Jawaban:

287

Karena ini adalah hasil teratas di Google, saya pikir saya akan menambahkan cara lain untuk melakukan ini. Secara pribadi saya lebih suka yang ini, karena ia meninggalkan implementasi ke kerangka 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/'
pewarna
sumber
2
Apakah Anda tahu jika ada cara yang bersih untuk menambahkan nama host ke url statis (jika tidak ada di STATIC_URL)? Saya perlu menambahkan gambar atau sumber lain di email, di mana pengguna tidak akan dapat menemukan sumber daya dengan url relatif.
gepatino
3
Ini tidak berfungsi untuk saya saat menjalankan di Debug (belum mencoba dengan DEBUG = Salah). Saya hanya mendapatkan jalur yang dilewati ke metode statis dikembalikan. Menggunakan Django 1.6. Adakah pikiran?
Shawn
Saya pikir kode menggunakan django.contrib.staticfiles.templatetags.staticfiles harus dipilih dengan mempertimbangkan yang kompatibel dengan penyimpanan-Django dan sejenisnya.
jdcaballerov
@gepatino Anda dapat merutekan hasilnya melalui request.build_absolute_uriseperti yang dijelaskan di sini: stackoverflow.com/questions/2345708/…
dyve
17
Di Django 2.0, ini akan menampilkan pemberitahuan penghentian. Gunakan from django.templatetags.static import staticsebagai gantinya.
Flimm
86

jawaban dyve adalah jawaban yang bagus, namun, jika Anda menggunakan "penyimpanan cache" pada proyek django Anda dan jalur url terakhir dari file-file statis harus mendapatkan "hash" (seperti style.aaddd9d8d8d7.css dari style.css ), maka Anda tidak dapat memperoleh url dengan tepat django.templatetags.static.static(). Sebagai gantinya, Anda harus menggunakan tag templat dari django.contrib.staticfilesuntuk mendapatkan url hash.

Selain itu, jika menggunakan server pengembangan, metode tag templat ini mengembalikan url yang tidak hash, sehingga Anda dapat menggunakan kode ini terlepas dari host mana yang sedang dikembangkan atau diproduksi! :)

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')
Kenial
sumber
1
Terima kasih untuk ini ... butuh beberapa saat untuk mencari tahu mengapa saya tidak mendapatkan suntikan md5 saya
ilovett
4
Jawaban ini masih mendapatkan hits dan digunakan secara aktif, jadi saya meningkatkan jawaban yang diterima dengan kredit ke @ Kenial. Ini masih merupakan solusi yang lebih disukai untuk masalah ini.
pewarna
12

inilah cara lain! (diuji pada Django 1.6)

from django.contrib.staticfiles.storage import staticfiles_storage
staticfiles_storage.url(path)
David Lam
sumber
Solusi yang bagus karena ini akan mengembalikan URL hash jika DEBUG disetel ke False. Secara opsional memaksa URL hash seperti: staticfiles_storage.url(path, force=True)
Marc Gibbons
7

Gunakan statictag default :

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

Ada tag lain di django.contrib.staticfiles.templatetags.staticfiles(seperti dalam jawaban yang diterima), tetapi sudah usang dalam Django 2.0+.

Max Malysh
sumber
6

Dari Django 3.0 Anda harus menggunakan from django.templatetags.static import static:

from django.templatetags.static import static

...

img_url = static('images/logo_80.png')
penyimpangan
sumber
5

Jawaban @ dyve tidak bekerja untuk saya di server pengembangan. Sebaliknya saya menyelesaikannya dengan find. Inilah fungsinya:

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)
Jahongir Rahmonov
sumber
1

Jika Anda ingin mendapatkan url absolut (termasuk protokol, host dan port), Anda dapat menggunakan request.build_absolute_urifungsi seperti di bawah ini:

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'
Mesut Tasci
sumber