2012-06-26 64 views
0

我試圖設置upload_to ManyToMany字段slug的ImageField的值。Django ImageField upload_to從M2M關係值

這裏是我的模型:

def get_image_path(instance, filename): 
    return os.path.join('gallery', str(instance.albums.all()[0]), filename) 

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

可惜的是它不工作。當我嘗試保存圖像對象時,出現以下錯誤:

'Image' instance needs to have a primary key value before a many-to-many relationship can be used.

是否有任何正確的方法?

感謝您的幫助!

回答

2

首先,在訪問instance.albums.all()之前,您必須首先保存instance(它是Image()的一個實例)和M2M關係w/albums

檢查Django admin file upload with current model id爲節省點Model在使用它之前pkupload_to()。由於M2M得到這裏的方式,而不是帖子中提到post_save()方法,使用m2m_changed信號告知instance.albums.all()的準備,是這樣的:

@receiver(m2m_changed, sender=Image.albums.through) 
def save_file_on_m2m(sender, instance, action, **kwargs): 
    if action == 'post_add' and hasattr(instance, _UNSAVED_FILEFIELD): 
     instance.image = getattr(instance, _UNSAVED_FILEFIELD) 
     instance.save()   
     instance.__dict__.pop(_UNSAVED_FILEFIELD) 

這依賴於M2M值Image.albums,如果沒有任何,image將會丟失。因此,我建議使用其他一些更堅實的密鑰。

您也可以在保存Image()本身和M2M關係後,手動直接在modelform上工作以保存image字段。

+0

感謝您的快速和有用的答案! – mario199