如何在Django中同时上传多个图像?

时间:2017-02-07 23:39:50

标签: django image django-models django-forms

我需要在我的表单中上传多个图片,但我只有一个图像区域,我不想拥有更多的图像区域,主要思想是在保存方法中为每个图像执行一个或类似的东西,但我不是&# 39;有任何想法,请帮助。

这是我的模特:

class Archivos(models.Model):
    id_archivo = models.AutoField(primary_key=True)
    id_unidad = models.IntegerField()
    nombre_archivo = models.CharField(max_length=255, blank=True)
    imagen  = models.ImageField(upload_to='img', null=True, blank=True)

我编辑了我的定义

def post(self, request, *args, **kwargs):
    form_class = self.get_form_class()
    form = self.get_form(form_class)
    files = request.FILES.getlist('imagen')
    if form.is_valid():
        a = 0
        for imagen in files:
            a = a+1
            img = form.save(commit=False)
            img.id_unidad = 1
            img.nombre_archivo ='hhh'+ str(a) 

            img.save()
        print(a);

        return self.form_valid(form)

    else:
        return self.form_invalid(form)

for cicle有效,但始终保存最后一张图像。我认为它的工作方式和更新但我不明白为什么?

这是我在模板中表单的一部分:

the multiple imagefield

3 个答案:

答案 0 :(得分:1)

其中一个选择是在您的产品上创建另一个模型,例如ArchivosGalleryForeignKey。例如,如果您的产品型号名为Archivos,那么您应该创建:

class ArchivosGallery(models.Model):
  image = models.ImageField(u'Images', upload_to='countries/images/', blank=True)
  countries = models.ForeignKey('Archivos', blank=True, null=True)

要在产品管理员中添加图片,您必须在admin.py中添加此代码:

class ImagesInline(admin.TabularInline):
  model = ArchivosGallery

class ArchivosAdmin(admin.ModelAdmin):
  inlines = [
    ImagesInline,
  ]
admin.site.register(Archivos, ArchivosAdmin) 

希望它可以帮助你

答案 1 :(得分:0)

您应该能够使用getlist访问多部分值:

以下是一个例子:

for bfile in request.FILES.getlist('files'):
    File(file=bfile, files=testing).save()

答案 2 :(得分:0)

正如@Zagorodniy建议你可能需要一个额外的表来保持上传图像的集合彼此相关,使用图像表中的ForeignKey。 (如果你需要这样的话)。

无论如何,要保存多个图像,请在for循环中创建Archivos模型的实例并逐个保存:

files = request.FILES.getlist('imagen')
if form.is_valid():

    for image in files:
        instance = Planfile(
        nombre_archivo = ... ,
        id_unidad = ... ,
        imagen = image  
        )
        instance.save()
    ...