2012-02-01 86 views
4

我想將自定義的upload_to函數傳遞給我的模型imageField,但我想將該函數定義爲模型函數....是可能的嗎?Django ImageField將可調用函數傳遞給upload_to

class MyModel(models.Model): 
    ... 
    image = models.ImageField(upload_to=self.get_image_path) 
    ... 

    def get_image_path(self, filename): 
     ... 
     return image_path 

現在我知道我不能用「自我」引用它,因爲自己並沒有在這一點上存在......是有辦法做到這一點?如果沒有 - 定義該功能的最佳位置在哪裏?

+0

的可能重複的[Django的的FileField與upload_to在運行時確定(http://stackoverflow.com/questions/1190697/django-filefield-with-upload-to-determined-at-runtime) – 2012-02-01 08:10:30

+0

呀,看看Paulo提到的鏈接 - 它在那裏清楚地顯示了它(沒有'self.',在models.py中將可調用的函數定義爲函數) – 2012-02-01 11:49:15

+0

看起來像我的答案畢竟在這裏: http:// stackoverflow.com/questions/1190697/django-filefield-with-upload-to-determined-at-runtime – jduncan 2012-05-30 03:29:09

回答

2

您可以使用staticmethod裝飾器在類的內部定義upload_to(作爲靜態方法)。 Hovever與典型的解決方案相比,它沒有真正的好處,它在類定義like here之前定義了get_image_path。

class MyModel(models.Model): 

    # Need to be defined before the field 
    @classmethod  
    def get_image_path(self, filename): 
     # 'self' will work, because Django is explicitly passing it. 
     return filename 

    image = models.ImageField(upload_to=get_image_path) 
+1

我看到代碼清晰度的好處 – jperelli 2012-02-13 18:29:36

+1

@Secator:我在我自己的代碼中嘗試過,但實際上並沒有調用它e方法 - 對於文件位置,我得到「當前: /o7pDX.jpg」 – Colleen 2012-04-26 16:40:30

+0

@Colleen,它將靜態方法轉換爲字符串。看起來方法必須是模塊(或某個模塊)的直接屬性。 – mjumbewu 2013-01-04 23:09:40

8

所以只要刪除「@classmethod」和Secator的代碼將工作。

class MyModel(models.Model): 

    # Need to be defined before the field  
    def get_image_path(self, filename): 
     # 'self' will work, because Django is explicitly passing it. 
     return filename 

    image = models.ImageField(upload_to=get_image_path)