Django - Как я могу отобразить фотографию, сохраненную в ImageField? - PullRequest
9 голосов
/ 23 марта 2012

С этим я часами ходил кругами.
У меня есть модель UserProfile с profile_pic ImageField.Я сохранил фотографию пользователя и теперь хочу ее отобразить, но ничего не работает.Я просмотрел документы, ТАК, Google, безрезультатно.
Я загрузил фотографию, и я вижу, что URL был сохранен в базе данных.Вот что у меня есть:

# 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 (то есть 'media /'), но не URL фотографии.Если я заменю {{field.url}} на {{field}}, я получу URL с меткой «В настоящее время», флажок «Очистить» и возможность изменить изображение.Но я не могу видеть само изображение.
Кто-нибудь может подсказать, что я делаю не так?

Ответы [ 2 ]

19 голосов
/ 23 марта 2012

Извините, я не уделил достаточно внимания контексту field.«Поле», которое вы получаете из цикла for, представляет собой специализированную оболочку, которая включает в себя другие данные о поле для целей построения формы.Это не поле в самой модели, а просто ее представление для целей формы.

Чтобы получить текущее значение profile_pic, вам нужно использовать экземпляр формы:

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

{{ MEDIA_URL }} не требуется при использовании атрибута url, поскольку он автоматически добавляет MEDIA_URL.

8 голосов
/ 20 августа 2014

Это работает для меня:

    {% 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 - это тег шаблона, определяемый как:

from django import template

register = template.Library()

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