Django - 访问对应于media_url而不是media_root的imageField的url

时间:2014-06-04 04:42:21

标签: django django-models django-templates

我有以下模型,其中包含我想在模板show_item.html中显示的图片字段。

Models.py

class Item(models.Model):
    def get_file(self, filename):
        url = "%s/%s" % (settings.MEDIA_ROOT, filename)
        return url

    seller = models.ForeignKey(settings.AUTH_USER_MODEL)
    pic1 = ImageField(blank=True, upload_to=get_file, max_length=500)

我知道MEDIA_ROOT和MEDIA_URL已正确配置。

问题是在我的模板中,我尝试访问

 <img src="{{ item.pic1 }}">

未能找到。经过进一步调查,这是因为路径显示为我文件目录中的路径(例如/ home / user / apps / media / filename)而不是media_url(例如www.mysite.com/media/filename)。我检查了两个位置,实际上图像都是。

我的问题 - 如何在模板中访问www.mysite.com/media/filename表单的网址?我也试过了{{item.pic1.url}},但它仍然是我系统上的路径。

谢谢!

1 个答案:

答案 0 :(得分:0)

如果您的图片上传路径可以通过静态路径访问,只需使用静态网址即可。 或者我认为你可以写一个网址,指向一个视图来返回图像响应。

例如:

# in your urls.py
urlpatterns = patterns('',
    url(r'^image/(?P<pk>\d+)/$', 'image_view', name='image_view'),
)

然后在图像视图中响应图像内容。

from django.core.servers.basehttp import FileWrapper
from django.http import StreamingHttpResponse

def image_view(request, pk):
    item = Item.objects.get(pk=pk)
    filename = item.pic1.url
    wrapper = FileWrapper(open(filename, 'rb'))
    response = StreamingHttpResponse(wrapper)
    response['Content-Length'] = os.path.getsize(filename)
    response['Content-Disposition'] = 'attachment; filename=image.jpg'
    return response