【问题标题】:Django ImageField upload_to value from M2M relation来自 M2M 关系的 Django ImageField upload_to 值
【发布时间】:2012-06-27 22:28:27
【问题描述】:

我正在尝试从 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' 实例需要在一个主键值之前 可以使用多对多关系。

有没有正确的做法?

感谢您的帮助!

【问题讨论】:

    标签: python django django-forms


    【解决方案1】:

    在访问instance.albums.all()之前,首先必须保存instance,它是Image()的一个实例,以及带有albums的M2M关系。

    upload_to() 中使用pk 之前,请检查Django admin file upload with current model id 的保存点Model。由于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 字段。

    【讨论】:

    • 感谢您快速实用的回答!
    猜你喜欢
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 2016-05-24
    • 2010-12-04
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多