无法使用ImageField在django中上传图像

时间:2011-10-23 06:42:50

标签: django image

我正在编写我的第一个使用ImageField的django应用程序 困难。问题是我的图片没有上传。我看过了 我能找到很多例子。而且我不确定这里出了什么问题。

我正在尝试通过查看位置来验证我的照片是否正在上传 upload_to目录。当表单显示在网页上时 显示正确的上传文件按钮。当我点击提交时,下面的代码执行, 但是没有上传任何图片。

基于upload_to,我希望看到上传的图片可以看到以下图片之一: myproject/photosmyproject/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' )

3 个答案:

答案 0 :(得分:12)

来自django文档,我认为这可以提供帮助(过去这对我有帮助):

  

首先,为了上传文件,你需要确保你的文件    element正确地将enctype定义为“multipart / form-data”

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

答案 1 :(得分:4)

在您使用发布数据创建表单实例的视图中,请确保您已提供request.FILES

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

答案 2 :(得分:1)

这有点晚了,但'upload_to'不是一种方法。它是一个属性,表示MEDIA_ROOT的相对路径。如果要将文件保存在文件夹'photos'中,文件名为self.id,则需要在模型类的顶部创建一个函数。例如:

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)

有关图像文件对象here的更多信息。

有关upload_to here的更多信息。