如何将URL的内容导入模型中的Django ImageField?

时间:2012-11-12 19:00:25

标签: python django model download

假设我有以下模型定义:

class Image(models.Model):
    image = models.ImageField(upload_to='images')

现在进一步假设我想获取远程URL的内容并在上面的模型中插入一行。以此图片为例:

https://www.python.org/images/python-logo.gif

我从以下代码开始:

from tempfile import NamedTemporaryFile

fn = 'https://www.python.org/images/python-logo.gif'

# Read the contents into the temporary file.
f = NamedTemporaryFile()
f.name = fn
f.write(urlopen(fn).read())
f.flush()

# Create the row and save it.
r = Image(image=File(f))
r.save()

我认为没有理由不这样做。经过一些调试后,我发现了:

  • 远程图像无错误地下载并存储在临时文件中
  • 文件在MEDIA_ROOT目录中创建,但大小为0
  • 该行未保存,但没有异常被抛出!

有人能说清楚这里发生了什么吗?我究竟做错了什么?有更简单的方法吗?

如果有帮助,我在Linux上运行Django 1.4。

1 个答案:

答案 0 :(得分:1)

你确定没有例外吗?当我尝试这个时,我得到AttributeError: Unable to determine the file's size.这可能是由f.name = fn引起的。无法测量没有实际路径的文件(fn是URL)。将f.name恢复为原始值可以解决您的两个问题。

如果要显式设置新文件的名称,请使用:

newfile = File(f,name='python-logo.gif')
r=Image(image=newfile)
r.save()
newfile.close()

(额外的行因为File对象不会自动关闭)