Загруженный файл не сохраняется

Я пытаюсь добавить функцию в мое приложение, которая позволяет пользователям загружать их 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].

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