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"
olofom
источник

Ответы:

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/'
dyve
источник
2
Знаете ли вы, есть ли чистый способ добавления имени хоста в статический URL (если он отсутствует в STATIC_URL)? Мне нужно добавить изображения или другие ресурсы в почту, где пользователь не сможет найти ресурсы с относительными URL-адресами.
Гепатино,
3
Это не работает для меня во время работы в Debug (еще не пробовал с DEBUG = False). Я просто получаю путь, переданный в статический метод. Использование Django 1.6. Есть предположения?
Шон
Я думаю, что код, использующий django.contrib.staticfiles.templatetags.staticfiles, должен быть предпочтительным с учетом того, что он совместим с django-хранилищами и т.п.
jdcaballerov
@gepatino Вы можете перенаправить результат, request.build_absolute_uriкак описано здесь: stackoverflow.com/questions/2345708/…
дайв
17
В Django 2.0 будет отображаться уведомление об устаревании. Используйте from django.templatetags.static import staticвместо этого.
Flimm
86

Ответ dyve хороший, однако, если вы используете «кэшированное хранилище» в своем проекте django, и окончательные пути статических файлов по URL должны быть «хешированы» (например, style.aaddd9d8d8d7.css из style.css ), тогда вы не могу получить точный URL с django.templatetags.static.static(). Вместо этого вы должны использовать шаблон тега from, 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')
Kenial
источник
1
Спасибо за это ... мне потребовалось некоторое время, чтобы понять, почему мне не вводят мои хэши md5
ilovett
4
Этот ответ все еще получает хиты и активно используется, поэтому я улучшил свой принятый ответ с помощью кредитов @Kenial. Это все еще предпочтительное решение для этой проблемы.
дайв
12

вот другой способ! (проверено на Django 1.6)

from django.contrib.staticfiles.storage import staticfiles_storage
staticfiles_storage.url(path)
Дэвид Лэм
источник
Хорошее решение, так как это вернет хешированный URL, если для DEBUG установлено значение False. При желании можно использовать хешированный 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')
devaerial
источник
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'
Месут Таски
источник