2011-03-13 93 views
2

Django的模型我現在有這樣的:自動填充的ImageField在在保存

class youtube_video(models.Model): 
    video_url = models.CharField(max_length=150,blank=True, validators=[RegexValidator("^.*((v\/)|(embed\/)|(watch\?))\??v?=?(?P<vid_id>[^\&\?]*).*")]) 
    video_thumbnail = models.ImageField(upload_to="/thumbs") 

    def save(self, args*, kwargs**): 
     video_thumbnail = urllib2.urlretrieve(#trivial regex here that gets the thumbnail url from the video_url) 
     super(youtube_video, self).save(*args, **kwargs) 

這不是工作,但希望它證明什麼,我試圖做。實質上,我想在模型保存時使用模型中的另一個字段自動填充video_thumbnailImageField

回答

0

我的答案在很大程度上基於該previous answer,但它沒有工作所介紹,所以這裏有兩個版本,應該工作:

from django.core.files import File 
from django.core.files.temp import NamedTemporaryFile 
import urllib2 

class SomeModel(models.Model): 
    # Some attributes... 
    image = models.ImageField(upload_to='dir') 

     def save(self, *args, **kwargs): 
     url = 'http://www.path.to.image.com/image.jpg' 
     img_temp = NamedTemporaryFile(delete=True) 
     img_temp.write(urllib2.urlopen(url).read()) 
     img_temp.flush() 
     self.image.save('name_of_your_image.jpg',File(img_temp),save=False) 
     super(SomeModel, self).save(*args, **kwargs) 

如果你不關心圖像的名稱被保存在你的媒體文件夾中,你可以這樣做:

from django.core.files import File 
from django.core.files.temp import NamedTemporaryFile 
import urllib2 

class SomeModel(models.Model): 
    # Some attributes... 
    image = models.ImageField(upload_to='dir') 

     def save(self, *args, **kwargs): 
     url = 'http://www.path.to.image.com/image.jpg' 
     img_temp = NamedTemporaryFile(delete=True) 
     img_temp.write(urllib2.urlopen(url).read()) 
     img_temp.flush() 
     self.image = File(img_temp) 
     super(SomeModel, self).save(*args, **kwargs) 
2

請記住,您需要從實例方法中引用self

def save(self, args*, kwargs**): 
     self.video_thumbnail = urllib2.urlretrieve(...) 
     super(youtube_video, self).save(*args, **kwargs) 

但是仍然存在問題。 urlretrieve返回一個(filename,headers)元組,而不是一個有效的File對象。

有關如何檢索ImageField的文件,請參閱this question

編輯:

from django.core.files import File 
from django.core.files.temp import NamedTemporaryFile 

def save(self, args*, kwargs**): 
    img_temp = NamedTemporaryFile(delete=True) 
    img_temp.write(urllib2.urlopen(..regex..).read()) 
    img_temp.flush() 
    file_name = 'determine filename' 
    self.video_thumbnail.save(file_name, File(img_temp)) 
    super(youtube_video, self).save(*args, **kwargs) 

以上是基於上面鏈接了答案,Django文檔中讀到的FileField。我沒有必須自己使用FileFields,所以我希望這有幫助。

+0

遺憾的是仍然無法正常工作。我認爲urlretrieve本身就沒問題,但是我不確定'self.video_thumbnail'可以使用'urllib2.urlretrieve'對象。 – Tony 2011-03-13 04:25:20

+0

還有問題。我想知道在ModelForm中處理這可能是一個更好的主意嗎? – Tony 2011-03-13 07:11:06

+0

這將是一個更好的主意,除非您需要添加實例而不使用表單。雖然我不認爲使用表單會奇蹟般地讓您分配thumb_nail字段的工作方式。您需要按照鏈接問題中的說明創建文件的實例。 – 2011-03-13 07:30:47