我目前有这个:
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
,使用模型中的其他字段。
答案 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)