0

ImageField で画像を取得するモデルがあります。

class Result(models.Model):
    image = models.ImageField(upload_to=get_userphoto_upload_path)

URL または画像のいずれかを取ることができ、画像を透過的にモデルに保存するフォームが必要です。

これは私が考えていることです:

class ResultForm(forms.ModelForm):
  externalsource = forms.URLField(label='External URL', required=False)

  def clean(self):
    cleaned_data = super(ResultForm, self).clean()
    externalsource = cleaned_data.get('externalsource', False)
    if externalsource:
      req = requests.get(externalsource)
      image = StringIO(req.content)
      self.image.save(image)


  class Meta:
    fields = ['image']
    model = Result

私は self.image.save(image) が正しくないことを知っています (self.image は存在しません) ...それがフォームではなくモデルである場合、画像を手動で保存する方法です。その代わりに何を使用すればよいかわかりません。

4

1 に答える 1

0

次のようなことをしたいと思います。注意してください、私はそれを実行したり、テストしたりしていません。しかし、うまくいけば、それはあなたを正しい道に導くはずです。

from django.core.files.uploadedfile import InMemoryUploadedFile

class ResultForm(forms.ModelForm):
  externalsource = forms.URLField(label='External URL', required=False)

  def clean(self):
    cleaned_data = super(ResultForm, self).clean()
    externalsource = cleaned_data.get('externalsource', False)
    if externalsource:
      req = requests.get(externalsource)
      image = StringIO(req.content)
      file = InMemoryUploadedFile(file=image, field_name=None, name=externalsource, content_type=req.content_type, size=req.size, charset=None)

      # Oops, long time since I used Forms, don't know how to do FileFields in forms
      # but something like you already wrote:
      self.image.save(name=dirname(externalsource), content=file)

  class Meta:
    fields = ['image']
    model = Result

つまり、基本的には、InMemoryUploadedFileを作成し、そこに画像を詰め込むだけで、それをImageFieldに保存します。

実際には、SimpleUploadedFile()を単純化して使用することもできます。

また、フォームとモデル、およびファイルフィールドに関する別の質問が埋め込まれていることもわかりました。その方法を覚えていません。:P

于 2012-04-08T19:34:39.810 に答える