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, я подумав, що додам ще один спосіб зробити це. Особисто я віддаю перевагу цьому, оскільки він залишає реалізацію в рамках Джанго.

# 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-адресами.
гепатіно

3
Це не працює для мене під час роботи в Налагодженні (ще не пробували з 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замість цього.
Флейм

86

Відповідь dyve є гарною, однак, якщо ви використовуєте "кешоване сховище" у вашому проекті django, а остаточні URL-адреси URL-адрес статичних файлів повинні отримати "хеш" (наприклад, style.aaddd9d8d8d7.css від style.css ), то ви не можу отримати точну URL-адресу django.templatetags.static.static(). Замість цього потрібно використовувати тег шаблону, django.contrib.staticfilesщоб отримати хешований URL.

Крім того, у випадку використання сервера розробки цей метод тегів шаблонів повертає не хешований 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
Дякую за це ... знадобилось мені час, щоб зрозуміти, чому мені не вводили
хеди

4
Ця відповідь досі отримує звернення та активно використовується, тому я покращив свою прийняту відповідь із зарахуванням на @Kenial Це все ще є кращим рішенням цієї проблеми.
дайв

12

ось ще один спосіб! (перевірено на Django 1.6)

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

Гарне рішення, оскільки це поверне хешовану URL-адресу, якщо для DEBUG встановлено значення False. Необов’язково 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'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.