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

use*_*018 9 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 %}
Run Code Online (Sandbox Code Playgroud)

当我查看呈现的HTML的来源时,我看到的只是MEDIA_URL(即'media /'),而不是照片网址.如果我用{{field}}替换{{field.url}},我会获得带有"当前"标签的网址,一个"清除"复选框以及一个更改图片的选项.但我看不到图像本身.
任何人都可以建议我做错了什么?

Chr*_*att 19

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

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

<img src="{{ form.instance.profile_pic.url }}" />
Run Code Online (Sandbox Code Playgroud)

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


Mia*_*eng 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 %}
Run Code Online (Sandbox Code Playgroud)

get_type是一个模板标签,定义如下:

from django import template

register = template.Library()

@register.filter
def get_type(value):
    t = type(value)
    return t.__module__ + "." + t.__name__
Run Code Online (Sandbox Code Playgroud)