2012-01-13 11 views
13

Tengo el siguiente modelo en mi aplicación Django:¿Cómo obtener una URL de ImageField dentro de una plantilla?

class Image(models.Model): 
    image = models.ImageField(
     upload_to='images/', 
     height_field='height', 
     width_field='width' 
    ) 
    credit = models.CharField(max_length=50, blank=True) 
    caption = models.TextField(blank=True) 
    article = models.ForeignKey(Article) 
    width = models.PositiveIntegerField(
     blank = True, null = True, 
     editable = False, 
     default = 0 
    ) 
    height = models.PositiveIntegerField(
     blank = True, null = True, 
     editable = False, 
     default = 0 
    ) 

He configurado el MEDIA_ROOT a un directorio llamado/hmedia/dentro de mi raíz Web Apache, y he ajustado a MEDIA_URL 'http://localhost/hmedia/'. Esto parece haber funcionado: he subido con éxito un par de imágenes a través del sitio de administración de Django, y puedo ver esas imágenes a través del http://localhost/hmedia/images/[filename]. Y el sitio de administración de Django en realidad me muestra el nombre del archivo y enlaces a la URL en vivo para cada imagen, y los enlaces funcionan.

Mi problema es que no puedo encontrar la manera de obtener las direcciones URL o nombres de archivos de estas imágenes en mi plantilla:

<ul> 
{% for image in article.image_set.all %} 
    <li>Caption: "{{image.caption}}", Credit: "{{image.credit}}", URL: "{{image.url}}"</li> 
{% endfor %} 
</ul> 

Los anteriores resultados plantilla en esta salida:

<ul> 

    <li>Caption: "here's an image caption", Credit: "some photographer", URL: ""</li> 

    <li>Caption: "Another caption here", Credit: "Another photographer", URL: ""</li> 

</ul> 

En otras palabras, muestra correctamente las propiedades de título y crédito de cada imagen, pero no genera nada para {{image.url}}.

¿Cómo obtengo la URL de la imagen en mi plantilla? ¿Cómo lo hace la plantilla de interfaz de administrador de Django? (He clavado alrededor en el directorio de plantillas de administración, pero no puedo encontrar lo que estoy buscando.)

+2

Sólo tiene que acceder .Path y .url en el campo de la imagen en sí - por lo que 'image.image.path', 'image.image.url'. Como está, intenta acceder a esos atributos en la instancia del modelo, donde no existen. – AdamKG

Respuesta

30

Es necesario {{ image.image.url }} & {{ image.image.path }}, mientras {{ image }} - sólo un objeto de imagen

1

cambiar el código para este :

<ul> 
{% for image in article.image_set.all %} 
    <li>Caption: "{{ image.caption }}", Credit: "{{ image.credit }}", URL: "<a href ='/{{ image.image }}'{{ image.image }}</a>"</li> 
{% endfor %} 
</ul> 

Cambio {{image.url}} a {{}} porque image.image '.Imagen' contiene la ubicación de la imagen. La razón por la que no obtiene ningún valor de '.url' es que no tiene una url de campo en su clase Imagen en sus modelos.

-6

Crear una carpeta "estática" en la que estés proyecto Django y añadir esto a que estés archivo de configuración

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'), 
) 

Si usted no tiene esta línea está en tus ajustes también FICHA añadir que

BASE_DIR = os.path.dirname(os.path.dirname(__file__)) 

Ahora en la plantilla que se puede utilizar

{% static image.image.url %} 
+2

¡Esto no funcionará, porque los campos del campo de imagen no están relacionados con archivos estáticos! – azuax

Cuestiones relacionadas