Django - 如何显示保存在ImageField中的照片?

时间:2012-03-22 20:42:47

标签: django imagefield

我已经在这里圈了几个小时了 我有一个带有 profile_pic ImageField的UserProfile模型。我保存了用户照片,现在我想显示它,但没有任何效果。我浏览了文档,所以,谷歌,没有结果 我上传了一张照片,我可以看到该网址已保存在数据库中。 这就是我所拥有的:

# 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 /'),而不是照片网址。如果我用{{field}}替换{{field.url}},我会获得带有“当前”标签的网址,一个“清除”复选框以及一个更改图片的选项。但我看不到图像本身 任何人都可以建议我做错了什么?

2 个答案:

答案 0 :(得分:19)

对不起,我没有对field的上下文给予足够的重视。从for循环中获取的“字段”是一个专门的包装器,其中包含有关该字段的其他数据,以便构造表单。它不是模型本身的字段,只是为了表单的目的而表示它。

要获取profile_pic的当前值,您需要使用表单的实例:

<img src="{{ form.instance.profile_pic.url }}" />
使用{{ MEDIA_URL }}属性时,

url是不必要的,因为它会自动附加MEDIA_URL

答案 1 :(得分: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是一个定义为:

的模板标签
from django import template

register = template.Library()

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