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.)
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