1

I want to overwrite/replace a file whenever a new file is uploaded. Currently the app can upload the file to a specific folder but its not overwriting files in an event that a new file has been uploaded. I need assistance to resolve that.

views.py

def uploadfunc(request):
    if request.method=='POST':
        form =uploadfileform(request.POST,request.FILES)
        if form.is_valid():
            form.save()
            return render_to_response('upload_successful.html')
    else:
        form=uploadfileform()
    return render(request, 'upload.html',{'form':form})

models.py

class uploadfolder(models.Model):
    """ my application """
    File_to_upload = models.FileField(upload_to='')

forms.py

class uploadfileform(forms.ModelForm):
    class Meta:
        model=uploadfolder
        fields=('File_to_upload',)
Brown Bear
  • 19,655
  • 10
  • 58
  • 76
saum
  • 343
  • 6
  • 16

2 Answers2

3

You can achieve this using Django pre_save signal, which will delete the file before saving if exists.

from django.db.models.signals import pre_save
from django.dispatch import receiver
import os

#It will activate whenever you will save file in uploadfolder model
@receiver(pre_save, sender=uploadfolder)
def file_update(sender, **kwargs):
    upload_folder_instance = kwargs['instance']
    if upload_folder_instance.id:
        path = upload_folder_instance.file_to_upload.path
        os.remove(path)

Hope it will help.

vermanil
  • 212
  • 1
  • 8
2

Thanks @vermanil my update models.py that works for me.

from django.db.models.signals import pre_save
from django.dispatch import receiver
import os

class uploadfolder(models.Model):
    """ my application """
    File_to_upload = models.FileField(upload_to='')

@receiver(pre_save, sender=uploadfolder)
def file_update(sender, **kwargs):
    upload_folder_instance = kwargs['instance']
    if upload_folder_instance.File_to_upload:
        path = upload_folder_instance.File_to_upload.path
        os.remove(path)
saum
  • 343
  • 6
  • 16