¿Cómo obtener una URL de ImageField dentro de una plantilla?

Tengo el siguiente modelo en mi aplicación Django:

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 MEDIA_ROOT en un directorio llamado / hmedia / dentro de mi raíz web de Apache, y he establecido MEDIA_URL en 'http://localhost/hmedia/' . Esto parece haber funcionado: subí 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 de http://localhost/hmedia/images/[filename] . Y el sitio de administración de Django en realidad me muestra el nombre del archivo y los enlaces a la URL en vivo para cada imagen, y los enlaces funcionan.

Mi problema es que no puedo averiguar cómo obtener las URL o los nombres de archivo de estas imágenes en mi plantilla:

 
    {% for image in article.image_set.all %}
  • Caption: "{{image.caption}}", Credit: "{{image.credit}}", URL: "{{image.url}}"
  • {% endfor %}

La plantilla anterior da como resultado esta salida:

 
  • Caption: "here's an image caption", Credit: "some photographer", URL: ""
  • Caption: "Another caption here", Credit: "Another photographer", URL: ""

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

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

Necesita {{ image.image.url }} & {{ image.image.path }} , mientras que {{ image }} – solo un objeto Image

Cambie su código a esto:

 
    {% for image in article.image_set.all %}
  • Caption: "{{ image.caption }}", Credit: "{{ image.credit }}", URL: ""
  • {% endfor %}

Cambie {{image.url}} por {{image.image}} porque ‘.image’ 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 imagen de clase en sus modelos.

Cree una carpeta “estática” en su proyecto django y agregue esto a su archivo de configuración

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

Si no tiene esta línea en su archivo de configuración, también agréguelo

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

Ahora en la plantilla puedes usar

 {% static image.image.url %}