2012-03-22 1 views
9

나는 이것으로 몇 시간 동안 서클에서 돌아 다녔다.
사용자 프로필 파일에 profile_pic ImageField가 있습니다. 사용자 사진을 저장했는데 이제는 표시하고 싶지만 아무 것도 작동하지 않습니다. 나는 아무런 결과도없이, 워드 프로세서를 통해 갔다.
사진을 업로드했는데 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}}로 대체하면 "현재"라는 라벨이 붙은 URL과 "지우기"확인란 및 이미지를 변경할 수있는 옵션이 표시됩니다. 하지만 이미지 자체를 볼 수는 없습니다.
누구든지 내가 뭘 잘못하고 있다고 제안 할 수 있습니까?

답변

18

죄송합니다. field의 문맥에 충분히주의를 기울이지 않았습니다. for 루프에서 얻은 "필드"는 양식을 작성하기 위해 필드에 대한 다른 데이터를 포함하는 특수한 래퍼입니다. 이것은 모델 자체의 필드가 아니며 양식의 목적을위한 표현입니다.

profile_pic의 현재 값을 얻으려면 폼의 인스턴스를 사용해야합니다 자동 MEDIA_URL를 추가하기 때문에, 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__