webentwicklung-frage-antwort-db.com.de

Django ruft die URL der statischen Dateien ab

Ich benutze reportlab pdfgen, um ein PDF zu erstellen. In der PDF gibt es ein von drawImage erstelltes Bild. Dazu brauche ich entweder die URL zu einem Bild oder den Pfad zu einem Bild in der Ansicht URL, aber wie erhalte ich den lokalen Pfad zum Bild?

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"
119
olofom

Da dies das beste Ergebnis bei Google ist, habe ich mir überlegt, eine andere Möglichkeit hinzuzufügen. Persönlich bevorzuge ich diesen, da die Implementierung dem Django Framework überlassen bleibt.

# 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/'
258
dyve

die Antwort von dyve ist jedoch gut, wenn Sie "Cache-Speicher" für Ihr Django Projekt verwenden und die endgültigen URL-Pfade der statischen Dateien "gehasht" werden sollen (wie z. B. style.aaddd9d8d8d7.css from style.css), dann können Sie mit Django.templatetags.static.static() keine genaue URL erhalten, sondern müssen das Template-Tag from Django.contrib.staticfiles Um eine gehashte URL zu erhalten.

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, ob es sich um einen Entwicklungs- oder einen Produktionshost 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')
80
Kenial

hier ist ein anderer Weg! (getestet am Django 1.6)

from Django.contrib.staticfiles.storage import staticfiles_storage
staticfiles_storage.url(path)
12
David Lam

Die Antwort von @ dyve hat auf dem Entwicklungsserver nicht funktioniert. Stattdessen habe ich es mit find gelöst. 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)
2

Verwenden Sie das Standard-Tag static:

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

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

1
Max Malysh

Wenn Sie eine absolute URL erhalten möchten (einschließlich Protokoll, Host und Port), können Sie request.build_absolute_uri Funktion wie folgt dargestellt:

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