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 回答