web-dev-qa-db-fra.com

Django Obtenir l'URL des fichiers statiques dans la vue

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

Comment je reçois l'URL:

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

Comme c'est le meilleur résultat sur Google, j'ai pensé ajouter une autre façon de procéder. 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/'
258
dyve

la réponse de dyve est bonne, cependant, si vous utilisez "le stockage en cache" sur votre Django et les chemins d’URL finaux des fichiers statiques doivent avoir "hashed" (tels que style.aaddd9d8d8d7.css à partir de style.css), vous ne pouvez pas obtenir d'URL précise avec Django.templatetags.static.static(). Vous devez utiliser la balise template de Django.contrib.staticfiles pour obtenir l'URL hachée.

De plus, en cas d'utilisation de serveur de développement, cette méthode de balise de modèle renvoie une URL non hachée, de sorte que vous pouvez utiliser ce code indépendamment du fait que l'hôte est en cours 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')
80
Kenial

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

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

La réponse de @ dyve n'a pas fonctionné pour moi sur 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)
2
Jahongir Rahmonov

Utilisez la balise par défaut static:

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

Il y a une autre balise dans Django.contrib.staticfiles.templatetags.staticfiles (comme dans la réponse acceptée), mais il est déconseillé dans Django 2.0+.

1
Max Malysh

Si vous voulez obtenir une URL absolue (protocole, hôte et port compris), vous pouvez utiliser request.build_absolute_uri fonction illustré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'
0
Mesut Tasci