Создание и редактирование формы с несколькими файлами 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
Единственная проблема, с которой я столкнулся, это физическое удаление файлов, когда я нажимаю на редактирование и изменяю файлы или удаляю элемент.