2012-03-22 64 views
9

我一直在這個圈子裏走了幾個小時。
我有一個用戶配置文件模型profile_pic ImageField。我保存了用戶照片,現在我想顯示它,但沒有任何效果。我經歷了文檔,SO,谷歌,沒有結果。
我上傳了一張照片,我可以看到該網址已保存在數據庫中。 這是我有:Django - 如何顯示保存在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 %} 

當我查看所呈現的HTML源,所有我看到的是MEDIA_URL(即「媒體/」),但沒有照片的URL。如果我用{{field}}替換{{field.url}},我會得到帶有「Currently」標籤的URL,一個「Clear」複選框和一個用於更改圖像的選項。但我無法看到圖像本身。
任何人都可以建議我做錯了什麼?

回答

18

對不起,我沒有足夠重視field的背景。從for循環獲得的「字段」是一個專門的包裝器,它包含有關用於構造表單的字段的其他數據。這不是模型本身的領域,僅僅是爲了表單的目的。

要獲得profile_pic當前值,則需要使用窗體的實例:

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

{{ MEDIA_URL }}使用url屬性時,它會自動追加MEDIA_URL是不必要的。

+0

@Crhis,感謝您的回答。但是,這仍然不起作用。現在Django渲染「media/profile_pic」(字段名稱,不是實際的圖像文件名和路徑) – user1102018 2012-03-22 21:00:53

+0

請參閱上面的更新。 – 2012-03-22 21:29:48

+0

再次感謝。它現在有效!我希望有關於包裝的詳細文檔。這樣可以節省我數小時的時間來弄清楚我做錯了什麼。乾杯! – user1102018 2012-03-22 21:36:59

8

這個工作對我來說:

{% 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定義爲templatetag:

from django import template 

register = template.Library() 

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