上传的文件不会保存
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].
我正在尝试向我的应用程序添加一项功能,允许用户上传他们的简历文件。 我创建了一个这样的模型:
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].