33

私は持っていmodels.pyます:

class Item(models.Model):
    image_file = models.ImageField(upload_to='images')
    image_url = models.URLField()

私はdjangoが自動的に画像をダウンロードしてローカルに保存しimage_url、それを「接続」したいimage_file

どのように動作するか:

  1. https://docs.djangoproject.com/s/img/site/hdr_logo.gif 私は管理者のimage_urlフィールドに貼り付けます
  2. 「保存」をクリック
  3. テンプレートに書き込み<img src="{{ item.image_file.url }}">ます。ではなく、サーバーからの画像を表示しますdjangoproject.com

私が試したこと:

クラスsaveのメソッドを上書きしました。Item経由で画像をローカルに保存しましたが、この保存された画像をフィールドurllibに接続することに固執していますimage_file

4

4 に答える 4

46
from django.core.files import File
import os

class Item(models.Model):
    image_file = models.ImageField(upload_to='images')
    image_url = models.URLField()

...

def get_remote_image(self):
    if self.image_url and not self.image_file:
        result = urllib.urlretrieve(self.image_url)
        self.image_file.save(
                os.path.basename(self.image_url),
                File(open(result[0]))
                )
        self.save()

デフォルトの save() メソッドをオーバーライドして、自動的に get_remote_image() を呼び出すことができます。

参照: https://docs.djangoproject.com/en/dev/topics/db/models/#overriding-model-methods

于 2013-05-05T09:24:24.033 に答える
3

Python3

from django.db import models
from django.core.files import File
from urllib.request import urlopen
from tempfile import NamedTemporaryFile

class Item(models.Model):
    image_file = models.ImageField(upload_to='images')
    image_url = models.URLField()

    def save(self, *args, **kwargs):
        if self.image_url and not self.image_file:
            img_temp = NamedTemporaryFile(delete=True)
            img_temp.write(urlopen(self.image_url).read())
            img_temp.flush()
            self.image_file.save(f"image_{self.pk}", File(img_temp))
        super(Item, self).save(*args, **kwargs)

似ていますが、「image_url」を追加すると「image_file」が自動保存されます

于 2019-04-16T19:33:50.220 に答える