Как удалить предыдущий загруженный файл, когда загружается новый, используя id

У меня есть простой класс загрузки резюме для пользователей, чтобы загрузить их резюме. он работает просто отлично, но когда они загружают новое резюме, предыдущее не удаляется. вот мой код:

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])

    def save(self, *args, **kwargs):
        try:
            this = ResumeDocument.objects.get(id=self.id)
            if this.cvfile != self.cvfile:
                this.cvfile.delete(save=False)
        except:
            pass
        super().save(*args, **kwargs)

Как я могу получить предыдущий id? id = self.id - 1. что-то вроде этого.

вот мои взгляды:

@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)
    context = {
        'form':form,
        'documents':documents,
    }
    return render(request, 'reg/pdf_resume.html', context)

и это также мой HTML код:

{% if documents %}
                
                {% for doc in documents %}
                {% if forloop.last %}
                <div class="existing-item antd-pro-pages-applicant-profile-partials-style-reviewList">
                    <div class="ant-divider ant-divider-horizontal ant-divider-with-text-center" role="separator"><span class="ant-divider-inner-text"> </span></div>
                    <div class="btn-delete" data-id="{{doc.id}}" style="position: relative;">
                        <div style="position: absolute; padding: 0.5rem; top: -1.5rem; left: -0.5rem; display: flex; justify-content: center; align-items: center;"><a style="color: red;"></a></div>
                    </div>
                    <a href="{{ doc.cvfile.url }}">cv</a>
                   </div>
                {% endif %}
                
                {% endfor %} 

            {%endif%} 

Одним из возможных решений является сохранение всех загруженных резюме для каждого пользователя и отслеживание последнего загруженного резюме с помощью поля uploaded_on. Вы можете обратиться к следующему высокоуровневому примеру:

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)

Вам необходимо внести соответствующие изменения в HMTL и views.py.

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 (я просто смотрю, есть ли возобновленные документы для этого пользователя, если да, то я даю ему форму, как если бы он редактировал существующий файл)

@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)

Теперь внутри pdf_resume.html вы можете просто передать 'form', потому что вы уже проверяете, есть ли у пользователя документ или нет.

Вернуться на верх