11

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

# 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 }} 替换 {{ field.url }},我会得到带有“当前”标签的 url、一个“清除”复选框和一个更改图像的选项。但我看不到图像本身。
谁能建议我做错了什么?

4

2 回答 2

21

抱歉,我没有足够关注field. 您从 for 循环中获得的“字段”是一个专门的包装器,其中包含有关该字段的其他数据,用于构建表单。它不是模型本身的字段,只是用于表单目的的表示。

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

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

{{ MEDIA_URL }}使用该url属性时是不必要的,因为它会自动附加MEDIA_URL.

于 2012-03-22T20:54:45.817 回答
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__
于 2014-08-20T19:32:49.623 回答