Загруженный файл не сохраняется
Я пытаюсь добавить функцию в мое приложение, которая позволяет пользователям загружать их cv-файл. Я создал такую модель:
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)
и создал модель формы, как показано ниже:
class DocumentForm(forms.ModelForm):
class Meta:
model = ResumeDocument
fields = ['cvfile']
my views.py:
def pdf_resume(request):
if request.method == 'POST':
form = DocumentForm(request.POST or None ,request.FILES or None , instance=request.user)
if form.is_valid():
form.save()
messages.success(request, f'Done!!!!')
return redirect('pdf_resume')
else:
form = DocumentForm(instance=request.user)
context = {'form':form}
return render(request, 'reg/pdf_resume.html', context)
и, наконец, мой HTML:
{% if messages %}
{% for m in messages %}
{{m}}
{% endfor %}
{% endif %}
<form method="POST" action="{% url 'pdf_resume' %}" enctype="multipart/form-data">
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4">Profile Info</legend>
{{ form }}
</fieldset>
<div class="form-group">
<button class="btn btn-outline-info" type="submit ">Update</button>
</div>
</form>
когда я нажимаю Update, он перенаправляет на страницу и сообщает мне об успехе и отсутствии ошибок. но файл не сохраняется в media. однако, когда я загружаю файл со страницы администратора, он загружается и сохраняется. что я делаю неправильно? пожалуйста, помогите мне
Вам не следует передавать instance=request.user
, потому что тогда форма будет пытаться редактировать объект пользователя, а не добавлять ResumeDocument
.
Вы можете связать ResumeDocument
с request.user
, установив атрибут .user
в .instance
, обернутый в форму:
from django.contrib.auth.decorators import login_required
@login_required
def pdf_resume(request):
if request.method == 'POST':
form = DocumentForm(request.POST, request.FILES) # ← no instance=request.user
if form.is_valid():
form.instance.user = request.user
form.save()
messages.success(request, f'Done!!!!')
return redirect('pdf_resume')
else:
form = DocumentForm() # ← no instance=request.user
context = {'form':form}
return render(request, 'reg/pdf_resume.html', context)
Если вы хотите отредактировать существующее ResumeDocument
, то вы можете попытаться получить это ResumeDocument
с помощью:
from django.contrib.auth.decorators import login_required
@login_required
def pdf_resume(request):
instance = ResumeDocument.objects.filter(user=request.user).first()
if request.method == 'POST':
form = DocumentForm(request.POST, request.FILES, instance=instance)
if form.is_valid():
form.instance.user = request.user
form.save()
messages.success(request, f'Done!!!!')
return redirect('pdf_resume')
else:
form = DocumentForm(instance=instance)
context = {'form':form}
return render(request, 'reg/pdf_resume.html', context)
Примечание: Вы можете ограничить представления для аутентифицированных пользователей с помощью декоратора
@login_required
декоратора [Django-doc].