【问题标题】:Django - Multiple photo uploadDjango - 多张照片上传
【发布时间】:2020-02-06 19:48:28
【问题描述】:

有没有办法用同一个上传按钮上传多张照片?我知道有一个额外的小部件,您可以将一定数量的图像添加到modelformset_factory,但我正在寻找一种方法让用户决定要上传多少张照片。如果我将extra=3 添加到表单集中,一切正常。但我想完全消除它。有些用户想上传 3 张图片,有些用户可能想上传 25 张。

我的看法

def list_home(request):
    image_form_set = modelformset_factory(Images, form=ImageForm)
    if request.method == "POST":
        listing_form = ListingForm(request.POST)
        formset = image_form_set(request.POST, request.FILES, queryset=Images.objects.none())
        if listing_form.is_valid() and formset.is_valid():
            post = listing_form.save(commit=False)
            post.user = request.user
            post.save()
            for form in formset.cleaned_data:
                if form:
                    image = form['image']
                    photo = Images(listing=post, image=image)
                    photo.save()
                    return render(request, 'success.html')

我的表格

类ListingForm(forms.ModelForm):

class Meta:
    model = Listing
    exclude = ('user', 'longitude', 'latitude', 'pub_date')


class ImageForm(forms.ModelForm):
    image = forms.ImageField(label='Image', widget=ClearableFileInput(attrs={'multiple': True}))

    class Meta:
        model = Images
        fields = ['image']

我的图像模型

class Images(models.Model):
    image = models.ImageField(upload_to=get_image_filename, verbose_name='Image')
    listing = models.ForeignKey(Listing, on_delete=models.CASCADE)

    def __str__(self):
        return str(self.image)

【问题讨论】:

标签: django django-models django-forms django-views


【解决方案1】:

为什么不以一种形式上传多个文件:

<form action="/pic_upload/" method="post" enctype="multipart/form-data"> 
{% csrf_token %} 
 <table>
  <tr>
   <td>select file to upload: </td><td><input name="files" type="file" size="50" accept="image/*" multiple>  </td><td>
   <button type="submit"> Upload </button> </td>
  </tr>
 </table>
</form>

视图函数应该如下所示:

def pic_upload(request):

    for afile in request.FILES.getlist('files'):
        if afile.content_type not in ("image/png","image/jpeg"):
            continue
        pic = Images()
        pic.image= afile
        pic.save()

    return redirect(......)

【讨论】:

  • 嗯,我正在尝试使用这种方法,但它似乎不想保存到我的数据库中。
  • 我添加了查看功能。
  • 非常感谢您的帮助。这让我痛了几天!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-21
  • 2017-09-09
  • 1970-01-01
  • 2022-08-24
  • 2018-03-20
相关资源
最近更新 更多