我正在尝试在创建模型实例时上传个人资料图片。我希望我的个人资料图片存储在一个文件夹中,该文件夹根据实例ID命名,因此一旦图片上传,我需要创建一个新的目录并将图片移动到那里。
我关注this,建议覆盖模型中的默认save()
方法,this建议使用post_save signal
两次保存新文件。< / p>
我目前的代码如下:
class Emp(models.Model):
photo = models.ImageField("Photo", blank=True, null=True, default='default_avatar.png')
def save(self, *args, **kwargs):
# Call standard save
super(Emp, self).save(*args, **kwargs)
if self.photo.path:
initial_path = self.photo.path
new_path = os.path.join(settings.MEDIA_ROOT,
'profile_picture_of_emp_{0}/{1}'.format(self.pk, os.path.basename(initial_path)))
# Create dir if necessary and move file
if not os.path.exists(os.path.dirname(new_path)):
os.makedirs(os.path.dirname(new_path))
os.rename(initial_path, new_path)
# Save changes
super(Emp, self).save(*args, **kwargs)
因此,这实际上会移动文件并正确创建new_path
,但self.photo.path
静止图片指的是旧位置,我无法找到更新此新路径的方法。 post_save
信号也会发生同样的情况,因为它不会更新已移动文件的路径。有什么建议吗?
谢谢!
答案 0 :(得分:1)
添加
my_new_path = 'profile_picture_of_emp_{0}/{1}'.format(self.pk, os.path.basename(initial_path))
self.photo = my_new_path;
super(Emp, self).save(*args, **kwargs)
最后。