如何使用django 2.x(或3)启用批量上载?
我有一个模型,它接受文件,计算md5和,如果这个值还不在数据库中,则存储文件。一次只能处理一个文件如何使用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
# 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()