围绕这一主题有几个问题,但我发现没有一个适合我想做的事情。我希望能够将文件上传到模型,并使用 pk 等模型实例属性将该文件保存在一个合适的位置。我知道这些东西会在之后设置model.save()
所以我需要编写一个自定义保存来执行此操作,但我无法弄清楚。这是我所拥有的:
class UploadModel(models.Model):
image = models.ImageField(upload_to='uploads')
def save(self, *args, **kwargs):
# Call standard save
super(UploadModel, self).save(*args, **kwargs)
if 'uploads' in self.image.path:
initial_path = self.image.path
# New path in the form eg '/images/uploadmodel/1/image.jpg'
new_path = os.path.join(settings.MEDIA_ROOT, 'images',
self._meta.model_name, self.pk, os.path.basename(initial_path))
# Create dir if necessary and move file
if not os.path.exists(os.path.dirname(new_path)):
makedirs(os.path.dirname(new_path))
os.rename(initial_path, new_path)
# Do something here to save the new file to the image field
# Save changes
super(UploadModel, self).save(*args, **kwargs)
我必须做什么image
字段让它引用这个新文件位置,并为其设置所有有用的属性,例如image.path
, image.name
, image.url
etc?
The docs https://docs.djangoproject.com/en/1.8/topics/files/#using-files-in-models说以上是我需要做的全部,但这只会导致image
字段指向不存在的文件。我看过this https://stackoverflow.com/questions/5135556/dynamic-file-path-in-django相关问题并尝试了snippet https://djangosnippets.org/snippets/1129/在一个答案中提到,但我还没有找到解决方案。