使用单独的输入在表单上上传 2 个单个文件:Django

Posted

技术标签:

【中文标题】使用单独的输入在表单上上传 2 个单个文件:Django【英文标题】:Uploading 2 single files on a form using separate inputs: Django 【发布时间】:2017-10-27 20:02:57 【问题描述】:

我正在尝试构建一个应用程序,要求用户上传 2 个不同的 pdf 文件,每个文件来自一个单独的输入按钮/区域。我是 Django 的新手,通过多次阅读文档,我已经完成了一些工作。

使用 <form method="post" enctype="multipart/form-data"> 我能够获得 2 个输入字段,如下所示:App Screenshot of 2 input areas。

但是,当我在任一情况下单击选择按钮并选择文件并单击“上传”时,两个输入区域中都会显示相同的 2 个文件。我已经对此进行了很多实验,但似乎找不到任何试图解决我的问题的资源。

快速说明:我知道有多种方法可以在单个输入区域上传多个文件,但我不想这样做。我想特别有 2 个不同的输入区域作为设计决策。

我不确定这是否接近正确的方法,或者是否有更好的工具来处理这种情况。以下是我编写的代码块。如果有人可以就如何更好地解决这个问题给我建议或告诉我如何修复我的代码,我将不胜感激。

谢谢!

forms.py

​​>
class FilePDFForm(forms.ModelForm):
class Meta:
    model = FilePDF
    fields = ('identifier', 'pdf', 'pdf2' )

models.py

​​>
class FilePDF(models.Model):
identifier = models.CharField(max_length=50, blank = True)
pub_date = models.DateTimeField(auto_now_add=True)
pdf = models.FileField(upload_to='documents/')
pdf2 = models.FileField(upload_to='documents/')

def __str__(self):
    return self.pdf.name + ',' + self.pdf2.name

views.py

​​>
def index(request):
if request.method == 'POST' and request.FILES['myfile'] and request.FILES['myfile2']:
    genfile = request.FILES['myfile']
    genfile2 = request.FILES['myfile2']
    fs = FileSystemStorage()
    filename = fs.save(genfile.name, genfile)
    filename2 = fs.save(genfile2.name, genfile2)
    uploaded_file_url = fs.url(filename)
    uploaded_file2_url = fs.url(filename2)
    file1_uploaded = True

    return render(request, '...index.html', 
        'uploaded_file_url': uploaded_file_url,
        'uploaded_file2_url': uploaded_file2_url,
        'file1_name': filename,
        'file2_name': filename2
    )

return render(request, '...index.html')

index.html

<div class="col-xs-3">
  <div class="form-group">
    <label class="control-label">Please select the first PDF file from your
    computer.</label> <input type="file" class="filestyle" name="myfile"
    data-buttontext=" Select" data-buttonname="btn btn-primary" /><br />
    <label class="control-label">Please select the second PDF file from your
    computer.</label> <input type="file" class="filestyle" name="myfile2"
    data-buttontext=" Select" data-buttonname="btn btn-primary" /> <button type=
    "submit" class="btn btn-primary">Upload</button>
  </div>
</div>

【问题讨论】:

【参考方案1】:

像这个表格一样改变你的看法,

def index(request):
  if request.method == 'POST':
    f = FilePDFForm(request.POST, request.FILES)
    if f.is_valid():
      new_object = f.save()  
      # do remaining thing here
      -----------------






  return render(request, '...index.html')

更多信息请参考https://docs.djangoproject.com/en/1.11/topics/forms/modelforms/#modelform

【讨论】:

如果 (request.method == 'POST' and request.FILES['myfile'] and request.FILES[ 'myfile2']): 只使用 if (request.method == 'POST'):

以上是关于使用单独的输入在表单上上传 2 个单个文件:Django的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Angular 2 在单个 ts 文件中编写 2 个表单验证?

如何从 django 中的内联表单接收上传的文件?

带有单独提交和上传按钮的 Django 应用程序

如何在节点js中使用单个api保存文本字段值以及文件上传?

可以在 QtDesigner 的单个 .ui 文件中定义多个表单吗?

当单个页面上存在 2 个表单时,如何使用 jQuery 表单验证插件验证 reCaptcha?