Desde hace unos días estoy trabajando en un proyecto para un cliente en el cual el usuario llena algunos formularios que se van guardando conforme presiona un botón, en algunos de estos formularios es posible subir archivos al servidor.
Lo interesante es que una de las especificaciones del proyecto es que en cierto punto se le pregunta al usuario si decide continuar con el siguiente formulario ó volver a comenzar y borrar toda la información que ya había introducido (Incluyendo los archivos subidos).
Cuando leo la documentación de Django explicaba lo siguiente:
Esto explica que al borrar una instancia del modelo en la base de datos únicamente se borra la info pero no el archivo.
Luego comencé a buscar en internet y encontré algunos ejemplos de como se hace creando un método en el modelo, los probé pero no me funcionaron, con lo cual decidí desarrollarlo.
Lo que decidí fué hacerlo en una de las vistas, cuando el usuario selecciona en el formulario que quiere borrar toda la información y comenzar de nuevo, pasa lo siguiente:
Si el usuario ha seleccionado "SI"
if obj.si_no == 'SI':
Extraigo el usuario de la request:
obj.user = User.objects.get(pk=request.user.id)
Busco todos los objetos creados por este usuario y los meto en una variable:
En mi caso el modelo se llama SeleccionUsuario.
FilesUser = SeleccionUsuario.objects.filter(user_id=obj.user)
Luego verifico cada objeto de la variable con un "for" y en el caso de que exista el atributo "file" lo que hago es borrar el archivo usando su ruta o "path". Quedaría de la siguiente manera:
for x in FilesUser:
if x.file:
os.remove(x.file.path)
He de mencionar que en el archivo views debes importar el módulo "os" para que funcione.
Este loop itera la variable FilesUser y borra los archivos de los objetos que contengan el atributo "file".
Luego para borrar todos los objetos de la base de datos utilizé una simple query.
SeleccionUsuario.objects.filter(user_id=obj.user).delete()
Luego de esto he redireccionado al usuario a una vista llamada "p2" para comenzar de nuevo, el código de la vista todo junto se ve así:
def p9(request):
if request.method =='POST':
form = SeleccionSiNoForm(request.POST, request.FILES)
autor = User.objects.get(pk=request.user.id)
if form.is_valid():
obj = form.save(commit=False)
#instanciar el usuario
obj.user = User.objects.get(pk=request.user.id)
if obj.si_no == 'SI':
#Verificar los archivos del usuario y borrarlos
FilesUser = SeleccionUsuario.objects.filter(user_id=obj.user)
for x in FilesUser:
if x.file:
os.remove(x.file.path)
#Borrar la info introducida por el usuario
SeleccionUsuario.objects.filter(user_id=obj.user).delete()
messages.success(request, f'Info borrada correctamente')
return redirect('p2')
else:
form.save()
messages.success(request, f'Guardado correctamente')
return redirect('p10')
else:
messages.warning(request, f'No hay datos')
else:
form = SeleccionSiNoForm(initial={'hecho': 'p9'})
return render(request, 'analisisproyecto/p9.html', {'form': form})
Espero que te sea de utilidad, y si te ha gustado el artículo, puedes dejar un comentario :-D