entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

0voto

Eliminar archivos físicamente con Django

Saludos.

Cómo puedo hacer que Django borre FÍSICAMENTE un archivo y no solamente el valor en la base de datos?

0voto

Peter comentado

@ibrames, por favor publica tus comentarios como comentarios y no como respuestas. También si se soluciona la pregunta y tienes otras dudas, abre preguntas nuevas, no publiques varias dudas en una pregunta, porque nunca habra una respuesta correcta y solo confunde.

Saludos.

1 Respuesta

1voto

white Puntos75880

intenta con signals, en tu caso creo que la clase que envia la señal es directorios
en tu models.py agrega esto:

from django.db.models.signals import pre_delete, post_delete
from django.dispatch import receiver
from django.conf import settings
import os

@receiver(pre_delete, sender=directorios)
def _directorios_delete(sender, instance, using, **kwargs):
    file_path = settings.BASE_DIR + str(instance.archivo)

    if os.path.isfile(file_path):
        os.remove(file_path)

0voto

ibrames comentado

Hermano disculpa, no entendí. Mi proyecto está así:
models.py

class directorios(models.Model):
  def url(self,filename):
    ruta = "MultimediaData/proyectos/%s/%s"%(self.proyecto,str(filename))
    return ruta
  archivo   = models.FileField(upload_to=url)
  proyecto = models.ForeignKey(proyecto)
  fecha     = models.DateTimeField(auto_now=True)

Esta es la vista que se encarga de eliminar archivos:
views.py

@login_required(login_url='/login/')
  def delete(request,id_dir,id_pro):
    var = int(id_pro)
    p = directorios.objects.get(id=id_dir)
    p.delete() 
    return HttpResponseRedirect('/descargas/page/1/%d/'%var)

Desde el template, tengo un botón donde llamo a esa vista que se llama delete, donde id_dir y id_pro son ID de directorio y ID de proyecto respectivamente. Lo que no entiendo es: dónde debo colocar tu solución?

0voto

white comentado

el codigo de mi respuesta de arriba lo debes poner en el archivo:

models.py

Al principio del archivo esto:

from django.db.models.signals import pre_delete, post_delete
from django.dispatch import receiver
from django.conf import settings
import os

al final del archivo esto:

@receiver(pre_delete, sender=directorios)
def _directorios_delete(sender, instance, using, **kwargs):
    file_path = settings.BASE_DIR + str(instance.archivo)

    if os.path.isfile(file_path):
        os.remove(file_path)

0voto

ibrames comentado

Hermano disculpa, no hace nada. No sé si lo estoy haciendo mal. Copie y pegué tu código en models.py como me indicaste y todavía sigue sin eliminar el archivo físico.

0voto

white comentado

talvez no encuentra la ruta, podrias agregar print(file_path) despues de la linea file_path = settings.BASE_DIR + str(instance.archivo) fijate en tu consola que ruta te imprime y si es correcta

0voto

ibrames comentado

Ok... ya lo he solucionado, tal cual como me indicaste, así era. Ahor abien, cómo sería si quiero eliminar un directorio? osea una carpeta con todos los archivos incluidos?
Te recuerdo que mi models.py lo tengo así:

models.py

class proyecto(models.Model):

   titulo   = models.CharField(max_length=300)
   financiamiento = models.BooleanField(default=False)
   autor = models.ForeignKey(participantes)
   metodo   = models.ForeignKey(metodos)
   episteme = models.ForeignKey(episteme)
   universidad  = models.ForeignKey(universidad)
   linea = models.ForeignKey(lineas)
   tutor = models.CharField(max_length=3, editable = False)

class Meta:
    unique_together = [("titulo", "metodo", "episteme", "universidad")]

def __str__(self):
    return self.titulo

class directorios(models.Model):
    def url(self,filename):
        ruta = "MultimediaData/proyectos/%s/%s"%(self.proyecto,str(filename))
        return ruta
    archivo = models.FileField(upload_to=url)
    proyecto = models.ForeignKey(proyecto)
    fecha   = models.DateTimeField(auto_now=True)

0voto

white comentado

shutil.rmtree te podria servir

import shutil

shutil.rmtree(directorio)

si directorio es por ejemplo '/documents/proyectos/proyecto/document.docs' entonces tienes que pasar a rmtree esto:

shutil.rmtree(os.path.dirname(directorio))

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta