我需要在Django页面上上传文件,但是,按照官方教程进行操作后,我无法上传文件,它始终显示错误“无效表格”,并且当我尝试打印出错误信息时,表格上显示“此字段为必填”。
值得注意的一件事是:我在一页上有2个表单,一个是upload form
,另一个是用于填写information
。不知道这是否是根本原因。
我尝试了Internet上提供的所有解决方案。
模板文件:
<form id="uploadForm" action="" method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<input type="file" value="upload" name="sourcefile">
<button type="submit">Upload</button>
</form>
Forms.py:
from django import forms
from .models import SourceFile
class UploadFileForm(forms.ModelForm):
class Meta:
model = SourceFile
fields = ('file', 'title')
Models.py:
from django.db import models
# Create your models here.
class SourceFile(models.Model):
title = models.CharField(max_length=255, blank=True)
file = models.FileField(upload_to="media/")
Views.py
def model_form_upload(request):
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
instance = SourceFile(file_field=request.FILES['file'])
instance.save()
return JsonResponse({'error': False, 'message': 'Uploaded Successfully!'})
else:
print("Invalid form")
# return JsonResponse({'error': True, 'errors': form.errors})
else:
form = UploadFileForm()
return render(request, 'source_validation.html', {'form': form})
答案 0 :(得分:1)
您的模板错误。使用{{ form.as_p }}
都应显示一个文件输入字段,因为file
是表单中的一个字段。 (因此请删除<input type="file" ...>
)
或者不使用它并手动添加<input>
字段,但是您必须使用正确的名称。您的表单需要一个“文件”参数,而不是一个“源文件”参数:
<input type="file" name="file">
此外,您还使视图中的事情变得过于复杂(即使您当前的代码在修复模板后也可以使用):
if form.is_valid():
form.save() # this will save your model
return redirect(...)