Создание и редактирование формы с несколькими файлами Django

может кто-нибудь подскажет как сохранить несколько файлов в post методе моей формы, я могу сохранить только 1 файл, не те которые я пытался загрузить.

Files = models.FileField(upload_to="alumno/archivos/%Y/%m/%d", null=True, blank=True, verbose_name='Archivos')

Так называется поле в моей модели Student.

Затем в моем методе post в представлении у меня есть следующий код, но он не сохраняет все, как я сказал, он сохраняет только 1 файл.

def post(self, request, *args, **kwargs):
        data = {}
        files = request.FILES.getlist('Files')
        try:
            action = request.POST['action']
            if action == 'edit':
                form = self.get_form()
                for f in files:
                    Alumno.objects.update(Files=f)
                data = form.save()
            else:
                data['error'] = 'No ha ingresado a ninguna opción'
        except Exception as e:
            data['error'] = str(e)
        return JsonResponse(data)

В данном случае, поскольку в Alumno.objects написано update, потому что я делаю edit, у меня та же проблема, что и с create. Пожалуйста, не мог бы кто-нибудь мне помочь? С уважением

Я хочу иметь возможность сохранять или редактировать два или более файлов в модели Pupil.

У меня получилось, но я изменил способ, раньше поле File было одним из класса Alumno

class Alumno (DatosBasicos):
    cp = models.PositiveIntegerField(verbose_name='Código Postal', validators=[RegexValidator(r'^\d{1,5}$')])
    monitores = models.ManyToManyField(Monitor, verbose_name='Monitor/es', max_length=250)
    pagado = models.BooleanField(default=False)
    foto = models.ImageField(upload_to='alumno/%Y/%m/%d', null=True, blank=True, verbose_name='Foto')
    # files = models.FileField(upload_to='alumno/%Y/%m/%d', null=True, blank=True, verbose_name='Archivos')
    # pagos_actividad_meses = models.ForeignKey(MesesPagados, on_delete=models.CASCADE)

    class Meta:
        verbose_name = 'Alumno'
        verbose_name_plural = 'Alumnos'
        ordering = ['id']

    def __str__(self):
        return self.get_full_name()

    def get_full_name(self):
        return '{} {}'.format(self.nombre, self.apellidos)

    def get_image(self):
        if self.foto:
            return '{}{}'.format(MEDIA_URL, self.foto)
        return '{}{}'.format(STATIC_URL, 'img/perfil_default.jpg')
        
    def get_files_path(self):
        # return '{}{}'.format(MEDIA_URL, self.Files)
        return '{}alumno/%Y/%m/%d/{}'.format(MEDIA_ROOT, self.id)

    def toJSON(self):
        item = model_to_dict(self)
        telf_convert = self.telf.as_national
        item['telf'] = telf_convert
        item['actividades'] = [{'id': g.id, 'nombre': g.nombre} for g in self.actividades.all()]
        item['monitores'] = [{'id': g.id, 'nombre': g.nombre} for g in self.monitores.all()]
        item['full_name'] = self.get_full_name()
        item['foto'] = self.get_image()
        item['Files'] = self.get_files_path()
        return item

и в методе post представления я поместил вышеприведенный код для добавления файла, но, конечно, он сохранил только 1 файл, последний из цикла for. Я думаю, что я делал это неправильно, поэтому я создал новую таблицу с отношением между Alumno и FileField.

class FilesAlumnos(models.Model):
    alumno_files = models.ForeignKey(Alumno, on_delete=models.CASCADE, null=True, blank=True)
    files = models.FileField(upload_to='alumno/%Y/%m/%d', null=True, blank=True, verbose_name='Archivos')

    class Meta:
        verbose_name = 'Archivo'
        verbose_name_plural = 'Archivos'
        ordering = ['id']

    def get_files_path(self):
        # return '{}{}'.format(MEDIA_URL, self.Files)
        return '{}alumno/%Y/%m/%d/{}'.format(MEDIA_ROOT, self.id)

    def toJSON(self):
        item = model_to_dict(self)
        item['Files'] = self.get_files_path()
        return item

Теперь в методе post я делаю следующее

class AlumnoUpdateView(LoginRequiredMixin, ValidatePermissionRequiredMixin, UpdateView):
    model = Alumno
    form_class = AlumnoForm
    template_name = 'alumno/create.html'
    success_url = reverse_lazy('general:alumno_list')
    permission_required = 'general.change_alumno'
    url_redirect = success_url

    def dispatch(self, request, *args, **kwargs):
        self.object = self.get_object()
        return super().dispatch(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        data = {}
        files = request.FILES.getlist('files')
        try:
            action = request.POST['action']
            if action == 'edit':
                form = self.get_form()
                data = form.save()
                for f in files:
                    new_file = FilesAlumnos.objects.create(alumno_files_id=data.get('id'), files=f)
                    new_file.save()
            else:
                data['error'] = 'No ha ingresado a ninguna opción'
        except Exception as e:
            data['error'] = str(e)
        return JsonResponse(data)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['title'] = 'Edición de los datos del Alumno'
        context['entity'] = 'Alumnos'
        context['list_url'] = self.success_url
        context['action'] = 'edit'
        return context

Единственная проблема, с которой я столкнулся, это физическое удаление файлов, когда я нажимаю на редактирование и изменяю файлы или удаляю элемент.

Вернуться на верх