2012-03-22 19 views
9

He estado dando vueltas en círculos durante horas con esto.
Tengo un modelo de perfil de usuario con profile_pic ImageField. Guardé la foto del usuario y ahora quiero mostrarla, pero nada funciona. Revisé documentos, SO, google, sin resultado.
Cargué una foto, y puedo ver que la url se guardó en la base de datos. Esto es lo que tengo:Django: ¿cómo puedo mostrar una foto guardada en ImageField?

# models.py 
    class UserProfile(models.Model): 
     ... 
     title  = models.CharField() 
     about_me = models.CharField() 
     profile_pic = models.ImageField(upload_to=content_file_name, blank=True) 

# views.py 
    def user_details(request): 
     if request.method == 'POST': 
      form = UserProfileForm(request.POST, request.FILES, instance=request.user.get_profile()) 
      if form.is_valid(): 
       form.save() 
       return HttpResponseRedirect('/') 
     else: 
      form = UserProfileForm(instance=request.user.get_profile()) 
     return render_to_response('user_details.html', 
       {'user': request.user, 'form': form}, 
       context_instance=RequestContext(request)) 

# user_details.html 
    {% for field in form %} 
     {% if field.name != "profile_pic" %} 
     <!-- display regular fields --> 
     {{ field.label_tag }}{{ field }} 
     {% else %} 
     <!-- display the user photo --> 
     <img src="{{ MEDIA_URL }}{{ field.url }}" /> 
     {% endif %} 
    {% endfor %} 

Cuando veo la fuente del HTML representado, todo lo que veo es el MEDIA_URL (es decir, 'los medios de comunicación /'), pero no la URL de la foto. Si reemplazo {{field.url}} con {{field}} obtengo la URL con la etiqueta "Actualmente", una casilla de verificación "Borrar" y una opción para cambiar la imagen. Pero no puedo ver la imagen en sí.
¿Alguien puede sugerir qué estoy haciendo mal?

Respuesta

18

Lo siento, no presté suficiente atención al contexto de field. El "campo" que obtiene del bucle for es un contenedor especializado que incluye otros datos sobre el campo para la construcción del formulario. No es el campo en el modelo en sí mismo, solo una representación del mismo para los propósitos de la forma.

para obtener el valor actual de profile_pic, es necesario utilizar la instancia del formulario:

<img src="{{ form.instance.profile_pic.url }}" /> 

{{ MEDIA_URL }} es innecesaria cuando se utiliza el atributo url, ya que añade automáticamente MEDIA_URL.

+0

@Crhis, gracias por la respuesta. Sin embargo, esto todavía no está funcionando. Ahora Django representa "media/profile_pic" (el nombre del campo, no el nombre de archivo de la imagen real y la ruta) – user1102018

+0

Ver la actualización anterior. –

+0

gracias de nuevo. ¡Ahora funciona! Ojalá hubiera algunos documentos completos sobre el envoltorio. Esto me habría ahorrado horas tratando de descubrir qué estaba haciendo mal. ¡Aclamaciones! – user1102018

8

Esto funciona para mí:

{% for field in form %} 
    <p> 
     {{ field.errors }} 
     {{ field.label_tag }} 
     {% if field.field|get_type == "django.forms.fields.ImageField" and field.value %} 
      <br/><img src="{{ field.value.url }}" width="240"></img></br> 
     {% endif %} 
     {{ field }} 
    </p> 
    {% endfor %} 

get_type es un templatetag definido como:

from django import template 

register = template.Library() 

@register.filter 
def get_type(value): 
    t = type(value) 
    return t.__module__ + "." + t.__name__ 
Cuestiones relacionadas