1

画像の URL を取得しました。オブジェクトの保存中にそこから ProcessedImageField 属性を設定したいと考えています。これまでのところ、私はこれを持っています:

 class Video(Media):
      url = models.URLField('url', max_length=256, default='')
      embed_url = models.URLField('embed url', max_length=256, default='')
      thumbnail = ProcessedImageField(upload_to='uploads',
                                  processors=[ResizeToFit(width=1024, height=1024, upscale=False)],
                                  format='JPEG',
                                  options={'quality': 75})


    def save(self, *args, **kwargs):
        from django.core.files.temp import NamedTemporaryFile
        import shutil
        import requests
        import re

        params = {
            'url': self.url,
            'autoplay': 1,
            'format': 'json',
        }

        try:
            data = requests.get('http://www.youtube.com/oembed', params=params).json()          
            embed_url = re.search('src=[\'"]([^\'"]*)[\'"]', data['html']).group(1)                
            thumbnail_url = data['thumbnail_url']
        except:
            pass

        response = requests.get(thumbnail_url, stream=True)
        img_temp = NamedTemporaryFile(delete=True)
        shutil.copyfileobj(response.raw, img_temp)

        # now image data are in img_temp, how to pass that to ProcessedImageField?

        super(Video, self).save(*args, **kwargs)
4

3 に答える 3

1

その時点でそのプロパティに直接保存できるはずです。

self.thumbnail.save("filename.ext", img_temp)
于 2013-10-15T20:19:37.670 に答える
0

これは、私の結果のコード (エラー処理なし) です。最終的には、一時ファイルを使用せずに ContentFile を使用することで、より簡単な方法で実装しました。

class Video(Media):
    url = models.URLField('url', max_length=256, default='')
    embed_url = models.URLField('embed url', max_length=256, default='')
    author = models.CharField('author', max_length=64, default='', blank=True)
    thumbnail = ProcessedImageField(upload_to='uploads',
                                processors=[ResizeToFit(width=1024, height=1024, upscale=False)],
                                format='JPEG',
                                options={'quality': 75})

    def save(self, *args, **kwargs):
        from django.core.files.base import ContentFile
        import requests
        import re

        params = {
            'url': self.url,
            'format': 'json',
        }

        data = requests.get('http://www.youtube.com/oembed', params=params).json()
        embed_url = re.search('src=[\'"]([^\'"]*)[\'"]', data['html']).group(1)
        thumbnail_url = data['thumbnail_url']
        author = data['author_name']
        title = data['title']

        image_data = requests.get(thumbnail_url, stream=True).raw.data
        self.thumbnail.save(title, ContentFile(image_data), save=False)
        self.embed_url = embed_url
        self.author = author
        self.title = title

        super(Video, self).save(*args, **kwargs)
于 2013-10-15T22:03:31.577 に答える