如何使用django 2.x(或3)启用批量上载?

如何使用django 2.x(或3)启用批量上载?,django,Django,我有一个模型,它接受文件,计算md5和,如果这个值还不在数据库中,则存储文件。一次只能处理一个文件 # models.py class RawFile(models.Model): # use the custom storage class fo the FileField orig_file = models.FileField( upload_to=media_file_name, storage=file_system_storage) md5su

我有一个模型,它接受文件,计算md5和,如果这个值还不在数据库中,则存储文件。一次只能处理一个文件

# models.py
class RawFile(models.Model):
    # use the custom storage class fo the FileField
    orig_file = models.FileField(
        upload_to=media_file_name, storage=file_system_storage)
    md5sum = models.CharField(max_length=36, default=timezone.now, unique=True)
    created = models.DateField(default=timezone.now)

    def save(self, *args, **kwargs):
        print('Saving new raw file.', self.md5sum)
        if not self.pk:  # file is new
            md5 = hashlib.md5()
            for chunk in self.orig_file.chunks():
                md5.update(chunk)
            self.md5sum = md5.hexdigest()
        if not self.id:
            self.created = timezone.now()
        print('Saving new raw file.', self.md5sum)
        super(RawFile, self).save(*args, **kwargs) 

    def __str__(self):
        return basename(self.orig_file.name)

    @property
    def abs_path(self): 
        return f'{MEDIA_ROOT}/{self.orig_file}'

    @property
    def filename(self):
        return basename(self.abs_path)

    @property
    def rawtools_status(self):
        path = dirname(self.abs_path)
        if isfile('QcDataTable.csv'):
            return 'Done'
        elif isfile(join(path, 'rawtools.txt')):
            return 'Running'
        return 'New file'

    @property    
    def href(self):
        return os.path.dirname('/'+self.orig_file.name)

    def link(self):
        print(self.href)
        return mark_safe(r'<a href="{}">Output</a>'.format(self.href))

    link.short_description = 'Browse'


# pipelines/forms.py

from django import forms
from .models import RawFile
如何存档多文件上载,以便在后端分别处理每个文件

更新:有了这段代码,多文件上传似乎可以正常工作

# views.py
from django.shortcuts import render, redirect
from django.views import generic
from .forms import UploadRawForm
from .models import RawFile

def upload_raw_view(request):
    '''Upload RAW files. Working for single file uploads'''
    form = UploadRawForm()
    if request.method == 'POST':
        form = UploadRawForm(request.POST, request.FILES)
        if not form.is_valid():
            return render(request, 'pipelines/upload.html', context={'form': form})
        if form.is_valid():
            files = request.FILES.getlist('orig_file')
            for f in files:
                rawfile = RawFile(orig_file = f)
                rawfile.save()
            return render(request, 'pipelines/upload.html', {'form': form})
    return render(request, 'pipelines/upload.html', {'form': form})

您还没有发布如何在视图中处理表单,但我认为您需要对包含多个值的字段使用“getlist”,如下所示

files = request.FILES.getlist('orig_file')
if form.is_valid():
   for f in files:
       rawfile = RawFile(orig_file = f)
       rawfile.save()

有关详细信息,请参见

I添加了views.py的内容。我只是保存表单。我认为您的简单方法在多个文件的情况下不起作用。您需要迭代文件并按照文档中的说明分别保存每个文件。当我在upload_raw_视图中查看数据时,即使选择并上载了多个文件,它也只包含一个文件。在本例中,
f
只是文件名,而不是文件本身。如果我可以迭代这些文件并一次提交一个文件?不,它不仅仅是名称,它是一个InMemoryUploadedFile。然而,你是对的,我原来的方法是行不通的。我更新了答案
files = request.FILES.getlist('orig_file')
if form.is_valid():
   for f in files:
       rawfile = RawFile(orig_file = f)
       rawfile.save()