Django ImageField upload_to来自M2M关系的值

时间:2012-06-26 14:56:28

标签: python django django-forms

我正在尝试从ManyToMany字段的slug设置ImageField的upload_to值。

这是我的模特:

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对象时,我收到一个错误:

  

'Image'实例需要在a之前具有主键值   可以使用多对多关系。

有没有正确的方法呢?

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

在访问instance之前,您必须先保存Image(),这是albums的实例,而M2M关系为instance.albums.all()

Model中使用pk之前,请Django admin file upload with current model id查看保存点upload_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)

这取决于Image.albums的m2m值,如果没有,image将丢失。因此,我建议使用一些比此更坚固的其他密钥。

在保存image本身和M2M关系后,您也可以直接使用modelform手动保存Image()字段。