2012-07-30 37 views
91

Estoy usando reportlab pdfgen para crear un PDF. En el PDF hay una imagen creada por drawImage. Para esto, o bien necesito la URL para una imagen o la ruta a una imagen en la vista. Logré construir la URL, pero ¿cómo obtendría la ruta local a la imagen?Django obtener la URL de archivos estáticos en la vista

Cómo llego la URL:

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

Respuesta

206

Dado que este es el primer resultado en Google, pensé que me gustaría añadir otra manera de hacer esto. Personalmente prefiero este, ya que deja la implementación al marco de Django. respuesta

# 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/' 
+6

Esta es una respuesta mucho mejor. – CodingWithoutComments

+2

¿Sabes si hay una forma clara de agregar el nombre de host a la url estática (si no está presente en STATIC_URL)? Necesito agregar imágenes u otros recursos en los correos, donde el usuario no podrá encontrar los recursos con las direcciones URL relativas. – gepatino

+3

Esto no funciona para mí mientras se ejecuta en Debug (aún no lo he intentado con DEBUG = False). Simplemente obtengo el camino pasado al método estático devuelto. Usando Django 1.6. ¿Alguna idea? – Shawn

66

de dyve es buena, sin embargo, si usted está utilizando "el almacenamiento en caché" en su proyecto Django y las rutas de URL finales de los archivos estáticos deben recibir "hash" (como style.aaddd9d8d8d7.css desde style.css), entonces no puede obtener una URL precisa con django.templatetags.static.static(). En su lugar, debe usar una etiqueta de plantilla desde django.contrib.staticfiles para obtener la URL hash.

Además, en caso de utilizar el servidor de desarrollo, este método de etiqueta de plantilla devuelve url no hash, por lo que puede utilizar este código independientemente de que el host sea de desarrollo o producción. :)

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') 
+1

Gracias por esto ... me tomó un tiempo descubrir por qué no estaba obteniendo mis hashes md5 inyectados – ilovett

+0

@ilovett mi placer! :) – Kenial

+0

¡Gracias por mejorar mi respuesta! – dyve

6

aquí está otra manera! (probado en Django 1.6)

from django.contrib.staticfiles.storage import staticfiles_storage 
staticfiles_storage.url(path) 
Cuestiones relacionadas