2012-11-12 36 views
0

假設我有以下的模型定義:如何將URL中的內容獲取到模型中的Django ImageField中?

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

你確定沒有例外嗎?當我嘗試這個時,我得到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() 

(額外的線,因爲文件對象不會自動關閉)

+0

這工作!非常感謝你。 –

相關問題