2012-03-22 20 views
9

Sto girovagando per ore con questo.
Ho un modello UserProfile con profile_pic ImageField. Ho salvato la foto dell'utente e ora voglio visualizzarla, ma niente funziona. Ho passato documenti, SO, google, senza risultati.
Ho caricato una foto e posso vedere che l'URL è stato salvato nel database. Questo è quello che ho:Django - Come posso visualizzare una foto salvata in 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 %} 

Quando osservo la fonte del rendering HTML, tutto quello che vedo è il MEDIA_URL (vale a dire 'media /'), ma non la foto URL. Se sostituisco {{field.url}} con {{field}} ottengo l'url con l'etichetta "Attualmente", una casella di controllo "Cancella" e un'opzione per cambiare l'immagine. Ma non riesco a vedere l'immagine stessa.
Qualcuno può suggerire cosa sto sbagliando?

risposta

18

Siamo spiacenti, non ho prestato abbastanza attenzione al contesto di field. Il "campo" che si ottiene dal ciclo for è un wrapper specializzato che include altri dati sul campo ai fini della costruzione del modulo. Non è il campo sul modello stesso, ma solo una sua rappresentazione ai fini della forma.

per ottenere il valore corrente di profile_pic, è necessario utilizzare un'istanza del form:

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

{{ MEDIA_URL }} non è necessaria quando si usa l'attributo url, dal momento che aggiunge automaticamente MEDIA_URL.

+0

@Crhis, grazie per la risposta. Tuttavia, questo non funziona ancora. Ora Django rende "media/profile_pic" (il nome del campo, non l'immagine reale nome file e percorso) – user1102018

+0

Vedere l'aggiornamento sopra. –

+0

grazie ancora. Ora funziona! Vorrei che ci fossero alcuni documenti approfonditi riguardanti l'involucro. Questo mi avrebbe risparmiato ore per cercare di capire cosa stavo facendo male. Saluti! – user1102018

8

questo funziona per me:

{% 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 è un templatetag definita come:

from django import template 

register = template.Library() 

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