首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Django:从图像url在ImageField中添加图像

Django:从图像url在ImageField中添加图像
EN

Stack Overflow用户
提问于 2009-09-08 18:29:44
回答 8查看 63.1K关注 0票数 91

请原谅我丑陋的英语;-)

想象一下这个非常简单的模型:

代码语言:javascript
复制
class Photo(models.Model):
    image = models.ImageField('Label', upload_to='path/')

我想从一个图像URL创建一张照片(即,不是在django管理网站手动)。

我认为我需要这样做:

代码语言:javascript
复制
from myapp.models import Photo
import urllib

img_url = 'http://www.site.com/image.jpg'
img = urllib.urlopen(img_url)
# Here I need to retrieve the image (as the same way that if I put it in an input from admin site)
photo = Photo.objects.create(image=image)

我希望我已经很好地解释了问题,如果没有告诉我的话。

谢谢您:)

编辑:

这可能行得通,但我不知道如何将content转换为django文件:

代码语言:javascript
复制
from urlparse import urlparse
import urllib2
from django.core.files import File

photo = Photo()
img_url = 'http://i.ytimg.com/vi/GPpN5YUNDeI/default.jpg'
name = urlparse(img_url).path.split('/')[-1]
content = urllib2.urlopen(img_url).read()

# problem: content must be an instance of File
photo.image.save(name, content, save=True)
EN

回答 8

Stack Overflow用户

发布于 2010-01-27 02:59:15

我刚刚为同样的问题创建了http://www.djangosnippets.org/snippets/1890/。除了使用urllib2.urlopen之外,代码类似于上面的pithyless的答案,因为urllib.urlretrieve默认不执行任何错误处理,所以很容易获得404/500页面的内容,而不是您需要的内容。您可以创建回调函数和自定义URLOpener子类,但我发现创建自己的临时文件会更简单,如下所示:

代码语言:javascript
复制
from django.core.files import File
from django.core.files.temp import NamedTemporaryFile

img_temp = NamedTemporaryFile(delete=True)
img_temp.write(urllib2.urlopen(url).read())
img_temp.flush()

im.file.save(img_filename, File(img_temp))
票数 98
EN

Stack Overflow用户

发布于 2017-02-20 18:14:44

结合Chris Adams和Stan所说的,并更新内容以在Python3上工作,如果您安装Requests,您可以这样做:

代码语言:javascript
复制
from urllib.parse import urlparse
import requests
from django.core.files.base import ContentFile
from myapp.models import Photo

img_url = 'http://www.example.com/image.jpg'
name = urlparse(img_url).path.split('/')[-1]

photo = Photo() # set any other fields, but don't commit to DB (ie. don't save())

response = requests.get(img_url)
if response.status_code == 200:
    photo.image.save(name, ContentFile(response.content), save=True)

Django's ContentFile documentationRequests' file download示例中有更多相关文档。

票数 15
EN

Stack Overflow用户

发布于 2009-09-08 10:35:58

ImageField只是一个字符串,一个相对于您的MEDIA_ROOT设置的路径。只需保存该文件(您可能希望使用PIL检查它是否为图像),并使用其文件名填充该字段。

因此,它与您的代码的不同之处在于,您需要将urllib.urlopen的输出保存到文件(在您的媒体位置中),计算出路径,将其保存到您的模型中。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1393202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档