在Django中使用ImageField无法上传图片

3
我正在编写我的第一个使用ImageField的Django应用程序,但遇到了困难。问题在于我的图片没有上传成功。我查看了尽可能多的示例,但不确定哪里出了问题。
我试图通过查看upload_to目录的位置来验证我的照片是否已上传。当表单在网页上显示时,正确的上传文件按钮会显示。当我点击提交后,下面的代码会执行,但是没有任何图像被上传。
根据upload_to的设置,我期望看到图像上传到以下位置之一:myproject/photos或myproject/media/photos,对吗?
我在这里做错了什么明显的事情吗?我该如何上传我的图片?
--------------settings.py--------------
MEDIA_ROOT = '/home/me/django_projects/myproject/media/'
MEDIA_URL = '/media/'

--------------model.py-------------

class Person(models.Model):
    lastName = models.CharField(max_length=20)
    firstName = models.CharField(max_length=20)
    image = models.ImageField(upload_to='photos', blank=True, null=True)

    #  save executes but no image is saved.
    #  Because images are uploaded along with a new entry, I needed a special
    #  work around to get the self.id
    def save(self):
        for field in self._meta.fields:
            if field.name == 'image':
               if self.id is not None:
                 #save image now
                 field.upload_to = 'photos/%d' % self.id
               else:
                 #Save image later
                 saveImageLast = True
        super(Customer, self).save()  # should create self.id if not already
        if saveImageLast == True:
            field.upload_to = 'photos/%d' % self.id
            super(Customer, self).save()
            print "save complete"  #prints, but no image ...?

--------------forms.py-------------

class PersonForm(ModelForm):

  class Meta:
      model = Person
      fields = ( 'lastName', 'firstName', 'image' )

如果代码正确,那么这里可能存在权限问题:https://dev59.com/YaHia4cB1Zd3GeqPU4ni#73045506 - DragonFire
3个回答

13

来自 Django 文档,我认为这可以帮助你(过去这对我有所帮助):

首先,为了上传文件,您需要确保您的<form>元素正确地将 enctype 定义为“multipart/form-data”

<form enctype="multipart/form-data" method="post" action="/foo/">

我确保我的表单包括enctype为“multipart/form-data”。但仍然无法上传。 :( - codingJoe

5

在您创建一个包含提交数据的表单实例时,请确保提供了 request.FILES。

form = PersonForm(request.POST, request.FILES)

1
这可能有点晚了,但是 'upload_to' 不是一种方法。它是一个属性,表示相对于您的MEDIA_ROOT的路径。如果您想以文件名self.id将图像保存在'photos'文件夹中,则需要在模型类的顶部创建一个函数。例如:
class Person(models.Model):
    def file_path(instance):
        return '/'.join(['photos', instance.id])
    image = models.ImageField(upload_to=file_path)

然后当您实际保存图像时,您将调用:

person = Person(firstName='hey', lasteName='joe')
person.image.save(ImageObject.name, ImageObject)

关于图像文件对象,可以在这里找到更多信息。

关于 upload_to,可以在这里找到更多信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接