Home > Enterprise >  how to delete previous uploaded file when a new one gets uploaded using id
how to delete previous uploaded file when a new one gets uploaded using id

Time:10-04

I have simple cv upload class for users to upload their resume. it works just fine but when they upload a newer one, the previous wont get deleted. this is my code:

class ResumeDocument(models.Model):
    id = models.AutoField(primary_key=True)
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    cvfile = models.FileField(upload_to="documents", null=True, validators= [validate_file_extension])

    @property
    def filename(self):
        return os.path.basename(self.cvfile.name)

how can I reach the previous id? id = self.id - 1. something like that.

this is my views:

@login_required
def pdf_resume(request):
    if request.method == 'POST':
        form = DocumentForm(request.POST,request.FILES)
        if form.is_valid():
            form.instance.user = request.user
            form.save()
            return redirect('pdf_resume')
        if 'delete' in request.GET:
            return delete_item(ResumeDocument, request.GET['id'])

    else:
        form = DocumentForm()
    documents = ResumeDocument.objects.filter(user=request.user)
    if documents:
        form = DocumentForm(instance=documents[0])
    context = {
        'form':form,
        'documents':documents,
    }
    return render(request, 'reg/pdf_resume.html', context)

and this is also my HTML code:

<form id="document-form" method="POST" enctype="multipart/form-data" action="{% url 'pdf_resume' %}" autocomplete="off" class="ant-form ant-form-horizontal">
                {% csrf_token %}
                <p>{{ form }}</p>
              

                <div class="ant-row-flex" style="margin-left: -10px; margin-right: -10px;"></div>
                <button id="btn_submit" type="submit"
                    class="ant-btn ant-btn-primary"
                    ant-click-animating-without-extra-node="false" style="float: left;"><span>upload</span></button>
            </form>

CodePudding user response:

One possible solution is to save all uploaded CVs for each user and track the last uploaded CV with field uploaded_on. You may refer to the below high-level example:

class CVFile(models.Model):
    file_name = models.CharField(max_length=200)
    cv_file = models.FileField(upload_to="documents", null=True, validators=[validate_file_extension])
    uploaded_on = models.DateTimeField(default=timezone.now, blank=True)

class ResumeDocument(models.Model):
    id = models.AutoField(primary_key=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    cv_file = models.ForeignKey(CVFile, on_delete=models.CASCADE)

You will need to amend your HMTL and views.py accordingly.

CodePudding user response:

models.py

class ResumeDocument(models.Model):
    id = models.AutoField(primary_key=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    cvfile = models.FileField(upload_to="documents", null=True, validators= 
    [validate_file_extension])

views.py(i just look is there any resumedocuments for that user if yes so i give him the form just if he was editing the existing file)

@login_required
def pdf_resume(request):
    if request.method == 'POST':
        form = DocumentForm(request.POST,request.FILES)
        if form.is_valid():
            form.instance.user = request.user
            form.save()
            return redirect('pdf_resume')
        if 'delete' in request.GET:
            return delete_item(ResumeDocument, request.GET['id'])

    else:
        form = DocumentForm()
    documents = ResumeDocument.objects.filter(user=request.user)
    if documents:#new
        form = DocumentForm(instance=documents[0])
    context = {
        'form':form,
        'documents':documents,
    }
    return render(request, 'reg/pdf_resume.html', context)

now inside your pdf_resume.html your can just pass the 'form' because you already check if that user has a document or not.

  • Related