2012-03-22 6 views
9

मैं इस के साथ घंटों के लिए सर्कल में चारों ओर जा रहा हूं।
मेरे पास प्रोफाइल_pic ImageField के साथ एक UserProfile मॉडल है। मैंने उपयोगकर्ता फोटो को सहेजा और अब मैं इसे प्रदर्शित करना चाहता हूं, लेकिन कुछ भी काम नहीं करता है। मैं डॉक्स, एसओ, गूगल के माध्यम से कोई परिणाम नहीं मिला।
मैंने एक फोटो अपलोड किया है, और मैं देख सकता हूं कि यूआरएल डेटाबेस में सहेजा गया था। यह है कि मैं क्या है: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.url}} को {{field}} के साथ प्रतिस्थापित करता हूं, तो मुझे "वर्तमान में" लेबल, "साफ़ करें" चेकबॉक्स और छवि बदलने के लिए एक विकल्प वाला यूआरएल मिलता है। लेकिन मैं खुद छवि को नहीं देख सकता।
क्या कोई सुझाव दे सकता है कि मैं क्या गलत कर रहा हूं?

उत्तर

18

क्षमा करें, मैंने field के संदर्भ में पर्याप्त ध्यान नहीं दिया। फॉर लूप से प्राप्त "फ़ील्ड" एक विशेष रैपर है जिसमें फॉर्म बनाने के प्रयोजनों के लिए फ़ील्ड के बारे में अन्य डेटा शामिल है। यह मॉडल पर ही क्षेत्र नहीं है, केवल फॉर्म के प्रयोजनों के लिए इसका एक प्रतिनिधित्व है।

profile_pic के वर्तमान मूल्य पाने के लिए आपको फ़ॉर्म के उदाहरण का उपयोग करने की आवश्यकता है:

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

{{ MEDIA_URL }} अनावश्यक जब 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 "मीडिया/प्रोफाइल_पीआईसी" प्रस्तुत करता है (फ़ील्ड नाम, वास्तविक छवि फ़ाइल नाम और पथ नहीं) – 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__ 
संबंधित मुद्दे