2011-10-23 38 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)