2013-01-20 25 views
3

我有一個縮略圖寬度因父對象(ForeignKey)而異的模型。我需要能夠將這些信息提供給imagekit處理器。這是我的:django imagekit處理器:使用存儲在數據庫中的尺寸

class Wall(models.Model): 
    #... 
    width = models.SmallIntegerField(null=True, blank=True) 
    #... 


class Poster(models.Model): 
    wall = models.ForeignKey(Wall, related_name='posters') 
    #... 
    original_image = models.ImageField(upload_to=upload_image_to) 

    def __init__(self, *args, **kwargs): 
     self.thumbnail = ImageSpecField([ 
       Adjust(contrast=1.2, sharpness=1.1), 
       SmartResize(height=163, width=self.wall.width) 
      ], 
      image_field='original_image', format='PNG' 
     ) 

     super(Poster, self).__init__(*args, **kwargs) 
    #... 

但是,如果我這樣做,沒有任何反應,甚至沒有生成縮略圖網址。

及以下將導致此此異常:
AttributeError的:「ForeignKey的」對象有沒有屬性「寬度」

class Poster(models.Model): 
    wall = models.ForeignKey(Wall, related_name='posters') 
    #... 
    original_image = models.ImageField(upload_to=upload_image_to) 

    thumbnail = ImageSpecField([ 
      Adjust(contrast=1.2, sharpness=1.1), 
      SmartResize(height=163, width=wall.width) 
     ], 
     image_field='original_image', format='PNG' 
    ) 
    #... 
+0

認真嗎?沒有人想要賞金? – demux

回答

4

您不能引用模型定義實例值。這是Django變得有點棘手的地方;模型是實例化時實例的外觀的聲明,這就是爲什麼相互依賴的字段必須按名稱引用其他字段,例如image_field='original_image'規範。

從imagekit的源代碼看,您可以看到processors可以採用靜態處理器的列表來應用,或者它需要一個可調用的函數,它應該返回要在生成時應用的處理器列表。由於您希望基於寬度在運行時更改生成時間,因此您可以將其用於您的優勢。

調用processors可調用,出現thumbnail字段的實例將允許您查看寬度。

def thumbnail_processors(instance, file): 
    # Dynamic width lookup. 
    width = instance.wall.width 
    return [ 
     Adjust(contrast=1.2, sharpness=1.1), 
     SmartResize(width=width, height=163), 
     ] 


class Poster(models.Model): 
    wall = models.ForeignKey(Wall, related_name='posters') 
    #... 
    original_image = models.ImageField(upload_to=upload_image_to) 

    thumbnail = ImageSpecField(
     processors=thumbnail_processors, 
     image_field='original_image', format='PNG' 
    ) 
    #... 

現在,當你訪問現場,thumbnail_processors將被稱爲在運行時,而不是在模型聲明,以獲得處理器的列表。 width從您的外鍵獲得,並執行適當的調整大小。

可能有一些需要調查的問題。當您訪問thumbnail時,將根據您的寬度生成圖像文件。如果稍後更改寬度並再次請求縮略圖,我不確定存儲和緩存後端的行爲方式。很可能您需要一個自定義文件名稱生成器,它可以對縮略圖的寬度進行編碼,以便當寬度發生變化時,將生成一個新的縮略圖,其名稱不同。

+0

我已經試過這個,但是訣竅是什麼文件參數。謝謝,這節省了我許多小時的時間,將我的頭撞在牆上。 – demux