2012-03-22 12 views
9

私はこれで何時間もサークルを回ってきました。
私はprofile_pic ImageFieldのUserProfileモデルを持っています。私はユーザーの写真を保存しましたが、今は表示したいのですが、何もできません。私はdocs、so、googleを経由しましたが、結果はありませんでした。
写真をアップロードしましたが、URLがデータベースに保存されていることがわかりました。 これは私が持っているものです:私は、レンダリングされたHTMLのソースを表示すると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 %} 

、私が見るすべてはMEDIA_URL(すなわち「メディア/」)ではなく、写真のURLです。私が{{field.url}}を{{field}}に置き換えた場合は、「現在」のラベル、「Clear」チェックボックス、画像を変更するオプションのURLが表示されます。しかし、私はイメージ自体を見ることができません。
誰かが私が間違っていることを示唆することはできますか?

答えて

18

申し訳ありませんが、fieldという文脈には十分注意を払っていませんでした。 forループから得られる "フィールド"は、フォームを構築するためのフィールドに関する他のデータを含む特殊なラッパーです。これは、モデル自体のフィールドではなく、フォームの目的のための表現です。

profile_picの現在の値を取得するには、フォームのインスタンスを使用する必要があります。url属性を使用しているとき、それは自動的にMEDIA_URLを追加しますので、

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

{{ MEDIA_URL }}は、不要です。

+0

@Crhis:

{% 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です。しかし、これはまだ動作していません。 Djangoは "media/profile_pic"(実際のイメージファイル名とパスではなくフィールド名)をレンダリングします – user1102018

+0

上記の更新を参照してください。 –

+0

もう一度ありがとう。それは今働きます!私は、ラッパーに関するいくつかの徹底的な文書があったと思う。これは、私が間違っていたことを理解しようとする時間を節約してしまったでしょう。乾杯! – user1102018

8

これは私の作品:、答えてくれてありがとう

from django import template 

register = template.Library() 

@register.filter 
def get_type(value): 
    t = type(value) 
    return t.__module__ + "." + t.__name__ 
関連する問題