J'essaie de renommer un fichier après l'avoir téléchargé dans la méthode de sauvegarde du modèle. Je renommer le fichier à une combinaison de la clé primaire des fichiers et un slug du titre du fichier.Django: fichier transféré verrouillé. Impossible de renommer
Je l'ai qui fonctionne quand un fichier est d'abord téléchargé, quand un nouveau fichier est téléchargé, et quand il n'y a pas de changements dans le fichier ou le titre du fichier.
Cependant, lorsque le titre du fichier est modifié, et le système essaie de renommer l'ancien fichier vers le nouveau chemin que je reçois l'erreur suivante:
WindowsError at /admin/main/file/1/
(32, 'The process cannot access the file because it is being used by another process')
Je ne sais pas vraiment comment obtenir autour de ça. J'ai essayé juste de copier le fichier sur le nouveau chemin. Cela fonctionne, mais je ne sais pas que je peux supprimer l'ancienne version.
Modèle raccourcies:
class File(models.Model):
nzb = models.FileField(upload_to='files/')
name = models.CharField(max_length=256)
name_slug = models.CharField(max_length=256, blank=True, null=True, editable=False)
def save(self):
# Create the name slug.
self.name_slug = re.sub('[^a-zA-Z0-9]', '-', self.name).strip('-').lower()
self.name_slug = re.sub('[-]+', '-', self.name_slug)
# Need the primary key for naming the file.
super(File, self).save()
# Create the system paths we need.
orignal_nzb = u'%(1)s%(2)s' % {'1': settings.MEDIA_ROOT, '2': self.nzb}
renamed_nzb = u'%(1)sfiles/%(2)s_%(3)s.nzb' % {'1': settings.MEDIA_ROOT, '2': self.pk, '3': self.name_slug}
# Rename the file.
if orignal_nzb not in renamed_nzb:
if os.path.isfile(renamed_nzb):
os.remove(renamed_nzb)
# Fails when name is updated.
os.rename(orignal_nzb, renamed_nzb)
self.nzb = 'files/%(1)s_%(2)s.nzb' % {'1': self.pk, '2': self.name_slug}
super(File, self).save()
Je suppose que la question est-ce que quelqu'un sait comment je peux renommer un fichier téléchargé lorsque le fichier téléchargé est pas téléchargé à nouveau? C'est la seule fois où il semble être verrouillé/utilisé.
Mise à jour:
approche de Tyler travaille, sauf lorsqu'un nouveau fichier est téléchargé la clé primaire n'est pas disponible et sa technique est de lancer une erreur ci-dessous.
if not instance.pk:
instance.save()
Erreur:
maximum recursion depth exceeded while calling a Python object
Est-il possible de saisir la clé primaire?
Je me demandais en fait pourquoi il n'y a pas de fonction move/rename sur le FileField. – Powerlord