Как удалить предыдущий загруженный файл, когда загружается новый, используя 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', потому что вы уже проверяете, есть ли у пользователя документ или нет.