上传的文件不会保存

uploaded file wont save

我正在尝试向我的应用程序添加一项功能,允许用户上传他们的简历文件。 我创建了一个这样的模型:

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

我的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>

当我单击“更新”时,它会重定向到该页面并向我发送成功且没有错误的消息。但文件不会保存在媒体中。但是,当我从管理页面上传文件时,它会被上传并保存。我究竟做错了什么?请帮助我

您不应该传递 instance=request.user,因为这样表单将尝试 编辑 用户对象,而不是添加 ResumeDocument.

您可以 link 将 ResumeDocument 设置为 request.user,方法是设置 .instance.user 属性,包装在以下形式中:

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<b>.instance.user = request.user</b>
            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<strong>, instance=instance</strong>)
        if form.is_valid():
            form<b>.instance.user = request.user</b>
            form.save()
            messages.success(request, f'Done!!!!')
            return redirect('pdf_resume')
    else:
        form = DocumentForm(<strong>instance=instance</strong>)
    context = {'form':form}
    return render(request, 'reg/pdf_resume.html', context)

Note: You can limit views to a view to authenticated users with the @login_required decorator [Django-doc].