2011-10-23 41 views
2

我正在编写使用ImageField的我的第一个django应用程序,并且我有 困难。问题是我的图片没有上传。我看过 尽可能多的例子,我可以找到。我不确定这里有什么问题。无法使用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') 

回答

12

从Django文档,我认为这可以帮助(在过去帮我):

首先,为了上传文件,你需要确保你的 元素正确定义ENCTYPE为“多/表单数据”

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

我确信,我的形式包括ENCTYPE为“多/表单数据”。但仍然没有上传。 :( – codingJoe

+0

你能否更新你的问题并添加你的views.py? –

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) 

更多的图像文件对象here

有关upload_to的更多信息here

4

在您创建后的数据形式的一个实例视图,确保您所提供request.FILES

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