【问题标题】:Django - How can I display a photo saved in ImageField?Django - 如何显示保存在 ImageField 中的照片?
【发布时间】:2012-03-22 20:42:47
【问题描述】:

我已经在这个圈子里转了几个小时了。
我有一个带有 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、一个“清除”复选框和一个更改图像的选项。但我看不到图像本身。
谁能建议我做错了什么?

【问题讨论】:

    标签: django imagefield


    【解决方案1】:

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

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

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

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

    【讨论】:

    • @Crhis,感谢您的回答。但是,这仍然行不通。现在 Django 呈现“media/profile_pic”(字段名,而不是实际的图像文件名和路径)
    • 再次感谢。现在可以了!我希望有一些关于包装的详尽文档。这将节省我数小时试图找出我做错了什么的时间。干杯!
    【解决方案2】:

    这对我有用:

        {% 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__
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多