保存后,在Django模型中自动填充Imagefield

时间:2011-03-13 03:51:53

标签: django django-models

我目前有这个:

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_thumbnail ImageField,使用模型中的其他字段。

2 个答案:

答案 0 :(得分:2)

请记住,您需要在实例方法中引用self

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

然而,仍然存在问题。 urlretrieve返回(文件名,标题)元组,而不是有效的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,所以我希望这有用。

答案 1 :(得分: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)