Django get the static files URL in view

Używam reportlab pdfgen do tworzenia pliku PDF. W pliku PDF znajduje się obraz utworzony przez drawImage. W tym celu potrzebuję adresu URL do obrazu lub ścieżki do obrazu w widoku. Udało mi się zbudować adres URL, ale jak uzyskać lokalną ścieżkę do obrazu?

Jak zdobyć URL:

prefix = 'https://' if request.is_secure() else 'http://'
image_url = prefix + request.get_host() + STATIC_URL + "images/logo_80.png"
Author: ppython, 2012-07-30

4 answers

Ponieważ jest to najlepszy wynik w Google, pomyślałem, że dodam inny sposób, aby to zrobić. Osobiście wolę ten, ponieważ pozostawia implementację Frameworkowi 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/'
 224
Author: dyve,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-07 05:24:06

Odpowiedź Dyve ' a jest dobra, jednak jeśli używasz "pamięci podręcznej" w swoim projekcie django i końcowe ścieżki url plików statycznych powinny zostać "zahaszowane"(takie jak styl .aaddd9d8d8d7css from style.css), wtedy nie można uzyskać dokładnego adresu url z django.templatetags.static.static(). Zamiast tego musisz użyć znacznika szablonu z django.contrib.staticfiles, aby uzyskać zahaszowany adres url.

Dodatkowo, w przypadku korzystania z serwera programistycznego, ta metoda tagów szablonu zwraca niehaszowany adres url, więc możesz użyć tego kodu niezależnie od tego, host to rozwój lub produkcja! :)

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')
 73
Author: Kenial,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-06 00:42:39

Jest inny sposób! (testowane na Django 1.6)

from django.contrib.staticfiles.storage import staticfiles_storage
staticfiles_storage.url(path)
 7
Author: David Lam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-21 19:05:14

@dyve 's answer didn' t work for me in the development server. Zamiast tego rozwiązałem to za pomocą find. Oto Funkcja:

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)
 0
Author: Jahongir Rahmonov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-26 11:10:07