首页 > 解决方案 > 表单上的 For 循环无法正常工作

问题描述

我有一项功能,允许用户将多张图片上传到他们的博客,但它无法正常工作。当用户上传多张图片时,只有其中一张会上传到 postgres 数据库。

看法

def DetailPostView(request, pk):
model = Post
post = Post.objects.get(pk=pk)

if request.method == 'POST':
    test = PostImagesForm(request.POST, request.FILES)
    files = request.FILES.getlist('images')
    if test.is_valid():
        for f in files:
            instance = test.save(commit=False)
            instance.post = Post.objects.get(pk=pk)
            instance.save()
    else:
        print(instance.errors)
         
postgallery = PostImages.objects.filter(post_id=post) 

context = {
    'post':post, 'PostImagesForm':PostImagesForm, 'postgallery':postgallery
    }
return render(request, 'blog/post_detail.html', context)

形式

class PostImagesForm(ModelForm):
class Meta:
    model = PostImages
    fields = ('images',)
    widgets = {
        'images': forms.ClearableFileInput(attrs={'multiple': True}),
    }

您可以看到我通过files = request.FILES.getlist('images')然后在内容上运行 for 循环来获取文件列表。

如果我破坏堆栈跟踪中的代码,我可以看到这两个文件在列表中,所以我很困惑为什么它没有正确地遍历列表并将每个文件上传到数据库。

在此处输入图像描述

更新

查看文档并找到有关多图像上传的部分,文档的操作方式与我相同。还是很迷茫。

标签: django

解决方案


我相信问题是因为我没有将当前图像传递给模型,所以它只上传了第一张图像。

解决方案

if request.method == 'POST':
        for f in request.FILES.getlist('images'):
            test = PostImagesForm(request.POST, request.FILES)
            if test.is_valid():
                instance = test.save(commit=False)
                instance.post = Post.objects.get(pk=pk)
                instance.images = f
                instance.save()

推荐阅读