5

URL から画像ファイルをダウンロードし、その画像を Django ImageField に割り当てようとしています。ここと[ここ](の例に従いました。

私のモデルは、適切な部分では次のようになります。

class Entity(models.Model):

     logo = models.ImageField(upload_to=_getLogoPath,null=True)

_getLogoPath コールバックは非常に単純です。

def _getLogoPath(self,filename):
    path = "logos/" + self.full_name
    return path

画像ファイルを取得して保存するためのコードも、定期的にスケジュールされた cron ジョブとして実行する予定のカスタム django-admin コマンドの一部として単純です。

...
img_url = "http://path.to.file/img.jpg"
img = urllib2.urlopen(img)
entity.logo.save(img_filename,img,True)
...

これを実行すると、次のエラーが発生します。

AttributeError: addinfourl instance has no attribute 'chunks'

私も画像に追加しようとしread()ましたが、同様のエラーが発生しました。また、画像を一時ファイルに書き込んでからアップロードしようとしましたが、同じエラーが発生します。

4

1 に答える 1

7

ドキュメントを読むと、 の 2 番目の引数entity.logo.saveがのインスタンスである必要があることがわかります。django.core.files.File

したがって、画像を取得して imagefield を使用して保存するには、次の手順を実行する必要があります。

from django.core.files import File

response = urllib2.urlopen("http://path.to.file/img.jpg")
with open('tmp_img', 'wb') as f:
    f.write(response.read())

with open('tmp_img', 'r') as f:
    image_file = File(f) 
    entity.logo.save(img_filename, img_file, True)
os.remove('tmp_img')

への呼び出しから返されるオブジェクトurlopenは、画像そのものではありません。ただし、このreadメソッドはバイナリ イメージ データを返します。

于 2012-11-15T08:28:44.617 に答える