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?

Peter comentado Ene 23, 2015

@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 Puntos75600

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)

ibrames comentado Ene 23, 2015

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?

white comentado Ene 23, 2015

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)

ibrames comentado Ene 23, 2015

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.

white comentado Ene 23, 2015

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

ibrames comentado Ene 23, 2015

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)

white comentado Ene 23, 2015

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.

¿Conoces alguien que puede responder?
¡Comparte esta pregunta!


Actividad Reciente

  • africanus1989 ganó una medalla hace 51 minutos

    Buena Pregunta - Recibido +1 votos en pregunta
  • Maikelpr82 ganó una medalla hace 2 horas

    Club de los 100 - Received total of 100 points
  • Leonardo-Tadei ganó una medalla hace 7 horas

    Buena Respuesta - Recibido +1 votos en respuesta
  • JorgeL ganó una medalla hace 7 horas

    Buena Pregunta - Recibido +1 votos en pregunta
  • AdanCervera ganó una medalla hace 7 horas

    Buena Pregunta - Recibido +1 votos en pregunta
  • Leonardo-Tadei ganó una medalla hace 7 horas

    Buena Respuesta - Recibido +1 votos en respuesta
  • steven ganó una medalla hace 7 horas

    Buena Pregunta - Recibido +1 votos en pregunta
  • Alex_Numpaque comentó hace 7 horas

    encuesta php mysql
  • carlossevi ganó una medalla hace 7 horas

    Buen Comentario - Recibió +2 votos

¿Eres Usuario Apple?

...

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

Conecta