Django affiche l'URL des fichiers statiques

133

J'utilise reportlab pdfgen pour créer un PDF. Dans le PDF, il y a une image créée par drawImage. Pour cela, j'ai besoin de l'URL d'une image ou du chemin vers une image dans la vue. J'ai réussi à créer l'URL, mais comment puis-je obtenir le chemin local de l'image?

Comment j'obtiens l'URL:

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

Réponses:

287

Comme il s'agit du meilleur résultat sur Google, j'ai pensé ajouter une autre façon de le faire. Personnellement, je préfère celui-ci, car il laisse l'implémentation au framework 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/'
teindre
la source
2
Savez-vous s'il existe un moyen propre d'ajouter le nom d'hôte à l'url statique (s'il n'est pas présent dans STATIC_URL)? J'ai besoin d'ajouter des images ou d'autres ressources dans les mails, où l'utilisateur ne pourra pas trouver les ressources avec des URL relatives.
gepatino
3
Cela ne fonctionne pas pour moi lors de l'exécution dans Debug (je n'ai pas encore essayé avec DEBUG = False). Je reçois simplement le chemin passé dans la méthode statique retournée. Utilisation de Django 1.6. Des pensées?
Shawn
Je pense que le code utilisant django.contrib.staticfiles.templatetags.staticfiles devrait être préféré en tenant compte du fait qu'il est compatible avec django-storages et autres.
jdcaballerov
@gepatino Vous pouvez acheminer le résultat request.build_absolute_uricomme décrit ici: stackoverflow.com/questions/2345708/…
dyve
17
Dans Django 2.0, cela affichera un avis de dépréciation. Utilisez from django.templatetags.static import staticplutôt.
Flimm
86

La réponse de dyve est bonne, cependant, si vous utilisez le "stockage mis en cache" sur votre projet django et que les chemins d'URL finaux des fichiers statiques doivent être "hachés" (comme style.aaddd9d8d8d7.css de style.css ), alors vous impossible d'obtenir une URL précise avec django.templatetags.static.static(). Au lieu de cela, vous devez utiliser la balise de modèle de django.contrib.staticfilespour obtenir l'URL hachée.

De plus, en cas d'utilisation d'un serveur de développement, cette méthode de balise de modèle renvoie une URL non hachée, vous pouvez donc utiliser ce code quel que soit l'hôte qu'il s'agit de développement ou de production! :)

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
la source
1
Merci pour cela ... il m'a fallu un certain temps pour comprendre pourquoi je ne me faisais pas injecter mes hachages md5
ilovett
4
Cette réponse reçoit toujours des appels et est activement utilisée, j'ai donc amélioré ma réponse acceptée avec des crédits à @Kenial. C'est toujours la solution préférée pour ce problème.
dyve
12

voici une autre façon! (testé sur Django 1.6)

from django.contrib.staticfiles.storage import staticfiles_storage
staticfiles_storage.url(path)
David Lam
la source
Bonne solution car cela renverra l'URL hachée si DEBUG est défini sur False. Vous pouvez éventuellement forcer l'URL hachée comme ceci: staticfiles_storage.url(path, force=True)
Marc Gibbons
7

Utilisez la staticbalise par défaut :

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

Il existe une autre balise dans django.contrib.staticfiles.templatetags.staticfiles(comme dans la réponse acceptée), mais elle est obsolète dans Django 2.0+.

Max Malysh
la source
6

Depuis Django 3.0, vous devez utiliser from django.templatetags.static import static:

from django.templatetags.static import static

...

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

La réponse de @ dyve n'a pas fonctionné pour moi dans le serveur de développement. Au lieu de cela, je l'ai résolu avec find. Voici la fonction:

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
la source
1

Si vous souhaitez obtenir une URL absolue (y compris le protocole, l'hôte et le port), vous pouvez utiliser la request.build_absolute_urifonction indiquée ci-dessous:

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
la source