Django zeigt die URL der statischen Dateien an

133

Ich verwende reportlab pdfgen, um ein PDF zu erstellen. In der PDF-Datei befindet sich ein Bild, das von erstellt wurde drawImage. Dazu benötige ich entweder die URL zu einem Bild oder den Pfad zu einem Bild in der Ansicht. Ich habe es geschafft, die URL zu erstellen, aber wie würde ich den lokalen Pfad zum Bild erhalten?

Wie bekomme ich die URL:

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

Antworten:

286

Da dies das Top-Ergebnis bei Google ist, dachte ich, ich würde einen anderen Weg hinzufügen, um dies zu tun. Persönlich bevorzuge ich dieses, da es die Implementierung dem Django-Framework überlässt.

# 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/'
färben
quelle
2
Wissen Sie, ob es eine saubere Möglichkeit gibt, den Hostnamen zur statischen URL hinzuzufügen (falls nicht in STATIC_URL vorhanden)? Ich muss Bilder oder andere Ressourcen in E-Mails hinzufügen, in denen der Benutzer die Ressourcen mit relativen URLs nicht finden kann.
Gepatino
3
Dies funktioniert bei mir während der Ausführung in Debug nicht (habe es noch nicht mit DEBUG = False versucht). Ich bekomme einfach den Pfad in die statische Methode zurückgegeben. Verwenden von Django 1.6. Irgendwelche Gedanken?
Shawn
Ich denke, der Code, der django.contrib.staticfiles.templatetags.staticfiles verwendet, sollte bevorzugt werden, wenn berücksichtigt wird, dass er mit Django-Speichern und ähnlichem kompatibel ist.
jdcaballerov
@gepatino Sie können das Ergebnis request.build_absolute_uriwie hier beschrieben weiterleiten
dyve
17
In Django 2.0 wird ein Verfallshinweis angezeigt. Verwenden Sie from django.templatetags.static import staticstattdessen.
Flimm
86

Die Antwort von dyve ist jedoch gut. Wenn Sie in Ihrem Django-Projekt "zwischengespeicherten Speicher" verwenden und die endgültigen URL-Pfade der statischen Dateien "gehasht" werden sollten (z. B. style.aaddd9d8d8d7.css von style.css ), dann Sie kann keine genaue URL mit bekommen django.templatetags.static.static(). Stattdessen müssen Sie das Vorlagen-Tag von verwenden django.contrib.staticfiles, um die Hash-URL abzurufen.

Darüber hinaus gibt diese Template-Tag-Methode bei Verwendung eines Entwicklungsservers eine nicht gehashte URL zurück, sodass Sie diesen Code unabhängig davon verwenden können, auf welchem ​​Host es sich um Entwicklung oder Produktion handelt! :) :)

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
quelle
1
Vielen Dank dafür ... ich habe eine Weile
gebraucht,
4
Diese Antwort wird immer noch getroffen und wird aktiv verwendet. Daher habe ich meine akzeptierte Antwort mit Credits für @Kenial verbessert. Dies ist immer noch die bevorzugte Lösung für dieses Problem.
Dyve
12

Hier ist ein anderer Weg! (getestet auf Django 1.6)

from django.contrib.staticfiles.storage import staticfiles_storage
staticfiles_storage.url(path)
David Lam
quelle
Gute Lösung, da dies die Hash-URL zurückgibt, wenn DEBUG auf False gesetzt ist. Erzwingen Sie optional die Hash-URL wie folgt: staticfiles_storage.url(path, force=True)
Marc Gibbons
7

Verwenden Sie das Standard- staticTag:

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

Es gibt ein anderes Tag in django.contrib.staticfiles.templatetags.staticfiles(wie in der akzeptierten Antwort), aber es ist in Django 2.0+ veraltet.

Max Malysh
quelle
6

Ab Django 3.0 sollten Sie Folgendes verwenden from django.templatetags.static import static:

from django.templatetags.static import static

...

img_url = static('images/logo_80.png')
devaerial
quelle
5

Die Antwort von @ dyve hat bei mir auf dem Entwicklungsserver nicht funktioniert. Stattdessen habe ich es mit gelöst find. Hier ist die Funktion:

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
quelle
1

Wenn Sie eine absolute URL (einschließlich Protokoll, Host und Port) erhalten möchten, können Sie die folgende request.build_absolute_uriFunktion verwenden:

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
quelle