copy file from one model to another
Inspired by Gerard's solution I came up with the following code:
from django.core.files.base import ContentFile#...class Example(models.Model): file = models.FileField() def duplicate(self): """ Duplicating this object including copying the file """ new_example = Example() new_file = ContentFile(self.file.read()) new_file.name = self.file.name new_example.file = new_file new_example.save()
This will actually go as far as renaming the file by adding a "_1" to the filename so that both the original file and this new copy of the file can exist on disk at the same time.
Although this is late, but I would tackle this problem thus,
class UploadImage(models.Model): Image = models.ImageField(upload_to="temp/") # i need to delete the temp uploaded file from the file system when i delete this model # from the database def delete(self, using=None): name = self.Image.name # i ensure that the database record is deleted first before deleting the uploaded # file from the filesystem. super(UploadImage, self).delete(using) self.Image.storage.delete(name)class RealImage(models.Model): Image = models.ImageField(upload_to="real/")# in my view or where ever I want to do the copying i'll do thisimport osfrom django.core.files import Fileuploaded_image = UploadImage.objects.get(id=image_id).Imagereal_image = RealImage()real_image.Image = File(uploaded_image, uploaded_image.name)real_image.save()uploaded_image.close()uploaded_image.delete()
If I were using a model form to handle the process, i'll just do
# django model forms provides a reference to the associated model via the instance propertyform.instance.Image = File(uploaded_image, os.path.basename(uploaded_image.path))form.save()uploaded_image.close()uploaded_image.delete()
note that I ensure the uploaded_image file is closed because calling real_image.save() will open the file and read its content. That is handled by what ever storage system is used by the ImageField instance
Try doing that without using a form. Without knowing the exact error that you are getting, I can only speculate that the form's clean() method is raising an error because of a mismatch in the upload_to parameter.
Which brings me to my next point, if you are trying to copy the image from 'temp/' to 'real/', you will have to do a some file handling to move the file yourself (easier if you have PIL):
import Imagefrom django.conf import settingsu = UploadImage.objects.get(id=image_id)im = Image.open(settings.MEDIA_ROOT + str(u.Image))newpath = 'real/' + str(u.Image).split('/', 1)[1]im.save(settings.MEDIA_ROOT + newpath)r = RealImage.objects.create(Image=newpath)
Hope that helped...