4 votes

Comment copier un fichier d'un FileField vers un autre FileField avec un chemin de téléchargement différent dans Django ?

J'utilise Django pour construire un site web et j'utilise deux FileField, l'un pour que l'utilisateur télécharge le document et l'autre pour que le système prenne le document pour en faire une sauvegarde.

My Model

def file_path_dir(instance, filename):
        return "File/{0}/{1}".format("File" + datetime.now().strftime("%Y.%m.%d"), filename)

def file_path_dir_copy(instance, filename):

        return "FileBackUp/{0}/{1}".format("FileBackUp" + datetime.now().strftime("%Y.%m.%d"), filename)
class MyModal(models.Model)
    UPLOAD_ROOT = "C:/"
    UPLOAD_COPY = "C:/"
    upload_storage = FileSystemStorage(location=UPLOAD_ROOT, base_url="/uploads")
    upload_storage_copy = FileSystemStorage(location=UPLOAD_COPY, base_url="/uploads")

    attachment_number = models.FileField(
        verbose_name=_("Attachment"),
        upload_to=file_path_dir,
        storage=upload_storage,
        blank=True,
        null=True,
    )
    attachment_copy = models.FileField(
        verbose_name=_("Backup Attachment"),
        upload_to=file_path_dir_copy,
        storage=upload_storage_copy,
        blank=True,
        null=True,
    )

My save view function

def save_model(self,request,obj,*args,**kwargs):
        print(obj)
        for sub_obj in obj:
            path = sub_obj.file_path_dir_copy(sub_obj.attachment_number.name)
            sub_obj.attachment_copy=path
        return super(AttachmentFormsetView,self).save_model(request,obj,*args,**kwargs)

J'ai utilisé le code ci-dessus mais cela ne fonctionne pas.

Il suffit de donner à l'attachment_copy le chemin du champ attachment_number.

Je veux également télécharger un fichier vers le chemin attachment_copy upload_to.

Veuillez m'aider à résoudre ce problème.

3voto

Aizaldeen Salamah Points 46

C'est une solution ! changement dans votre fonction de sauvegarde :

def save_model(self,request,obj,*args,**kwargs):

    from django.core.files.storage import FileSystemStorage
    for sub_obj in obj:
        fs = FileSystemStorage(location= "C:/FileBackup/{0}".format("FileBackup" + datetime.now().strftime("%Y.%m.%d")),base_url="/uploads")
        filename = fs.save(sub_obj.attachment_number.name, sub_obj.attachment_number)
        file_url = fs.url(filename)
        path = sub_obj.file_path_dir_copy(sub_obj.attachment_number.name)
        sub_obj.attachment_copy=path
    return super(AttachmentFormsetView,self).save_model(request,obj,*args,**kwargs)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X