首页 > 解决方案 > 使用 Django 表单上传多个文件

问题描述

我正在尝试编写一个可以一次处理上传多个文件的应用程序。我让应用程序为单个文件上传工作,但添加一个循环来处理文件列表还没有奏效。

#models.py
class image(models.Model):
    filename = models.CharField(max_length=100, blank=False, null=False)
    image = models.ImageField(upload_to='images/')
    uploaded_at = models.DateTimeField(auto_now_add=True)
    user = models.CharField(max_length=100, default='default')

形式:

class ImageForm(forms.ModelForm):
    class Meta:
    model = image
    fields = ('image',)
    widgets = {'image': forms.ClearableFileInput(attrs={'multiple':True}),} # Added to allow multiple file selections in one dialog box

和相关部分views.py

def image_upload(request):
    if request.method == 'POST':
        for f in request.FILES.getlist('image'):
            formI = ImageForm(request.POST, f, instance=image())
            if formI.is_valid():
                fs = formI.save(commit=False)
                fs.filename = f
                fs.user = request.user
                fs.save()

(视图中还有其他内容,但在此之前它会中断)。

结果是错误: AttributeError: 'TemporaryUploadedFile' object has no attribute 'get' 从该行:if formI.is_valid():

我最初有formI = ImageForm(request.POST, f, instance=image())withrequest.FILES而不是f,似乎改变是打破这一点的原因。我应该有什么而不​​是这两个选项?request.FILES导致仅上传所选图像中的一张。

传递给的正确对象是ImageForm什么?

使用 Python 3.6.8 和 Django 2.2.4

编辑:我已经看到关于多个文件上传的其他 SO 问题,包括建议的副本,但没有一个让我清楚地知道对象ImageForm需要什么(而不是f在我的示例中)。

标签: pythondjangodjango-forms

解决方案


使用 django `formsets. 那应该可以解决您的问题,并且还可以查看此链接以获取完整的实施。


推荐阅读