2011-10-21 112 views
1

我正在轉換遺留站點(最初用rails寫入),默認情況下使用格式{{pk}}.{{extension}}保存圖像,並且如果上傳新文件,該文件總是被覆蓋。 我想繼續使用這個Django版本的格式。Django ImageField/FileField使用模型的pk保存上傳的文件

我原本以爲擴展FileSystemStorage會走的路,但我不知道一種方式將當前模型對象傳遞給它。任何人都有一個「django方式」的建議來實現這個目標?

如果我需要編寫自己的類來擴展ImageField來管理這個,那就這樣吧。 :)只是想知道是否有一些簡單的我錯過了。

[編輯] 我做什麼的基礎上,回答surfeurxDrTyrsa

temp_image = None 

def image_path(self, uploaded_file_name): 
    prefix = 'designs/' 
    extension = os.path.splitext(uploaded_file_name)[-1] 
    if self.pk != None: 
     return prefix + str(self.pk) + extension 
    else: 
     tmp_name = str(uuid.uuid4()) 
     self.temp_image = prefix + tmp_name + extension 
     return self.temp_image 

image_upload = models.ImageField(upload_to=image_path, null=True, blank=True) 

def save(self): 
    self.updated_at = datetime.now() 

    is_new = self.pk == None 
    super(Design, self).save() 

    if is_new: 
     if self.temp_image != None: 
      os.rename(MEDIA_ROOT + self.temp_image, MEDIA_ROOT + self.image_path(self.temp_image)) 
      self.temp_image = None 

我現在有真正的問題是,我希望它覆蓋圖像。這將提供正確的文件名,但它看起來像我將不得不延長ImageField以覆蓋它。找到這個小傢伙:http://djangosnippets.org/snippets/636/

回答

3

您可以使用upload_to像:

def image_path(instance, filename): 
    return instance.id + os.path.splitext(filename)[1] 

class Brand(models.Model): 
    ... 
    logo = models.ImageField(upload_to=image_path, null=True, blank=True) 
+0

謝謝!這幫了很多。雖然我覺得很髒。這似乎是我用django編寫過的最不優雅的東西。 – oliverseal

3

您需要定義upload_to函數。它接受instance作爲參數。但是不要忘記,如果你是創建的實例,它將不會有pk(但你可以先保存它,然後保存圖像)。

+0

謝謝,這是有益的。 – oliverseal