IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Django Python Discussion :

Django upload de plusieurs fichiers


Sujet :

Django Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 57
    Par défaut Django upload de plusieurs fichiers
    Bonjour,

    Je souhaite pouvoir insérer plusieurs fichiers dans un répertoire à partir d'un formulaire et sauvegarder les nom dans la bdd.
    Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    models.py
     
    class Depart(models.Model):
        num_enreg = models.PositiveIntegerField(blank=True)
        date_emission = models.DateField(blank=True)
        types = models.CharField(max_length=5, blank=True)
        destinataire = models.CharField(max_length=50, blank=True)
        objet = models.CharField(max_length=100, blank=True)
        observation = models.CharField(max_length=100, blank=True)
        pj = models.FileField(null=True, upload_to=generate_filename, blank=True)
     
     
        def __unicode__(self):
            return unicode(self.objet)
     
    def generate_filename(instance, filename):
        year = datetime.now().year
     
     
        url = 'Depart/%s/%s' % (year, filename)
        print url
        return url
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    forms.py
    class DepartForm(forms.ModelForm):
        pj = forms.FileField(required=False,widget = forms.ClearableFileInput(attrs={'multiple':True}))
        class Meta:
            model = Depart
            fields = '__all__'
     
        def __init__(self, *args, **kwargs):
            super(DepartForm, self).__init__(*args, **kwargs)
            for field_name, field in self.fields.items():
                field.widget.attrs['class'] = 'form-control'
     
     
    views.py
    def depart(request):
        if request.method == 'POST':
     
            depart_form = DepartForm(request.POST, request.FILES)
     
            if depart_form.is_valid():
                num_enreg = depart_form.cleaned_data['num_enreg']
                date_emission = depart_form.cleaned_data['date_emission']
                types = depart_form.cleaned_data['types']
                destinataire = depart_form.cleaned_data['destinataire']
                objet = depart_form.cleaned_data['objet']
                observation = depart_form.cleaned_data['observation']
                pj = depart_form.cleaned_data['pj']
     
                handle_uploaded_file_depart(request.FILES['pj'],request.FILES['pj'])
     
                depart_form.save()
     
            return HttpResponseRedirect('liste_depart')
     
        else:
            depart_form = DepartForm()
     
        return render(request, 'formulaire_depart.html', {'depart_form': depart_form})   
     
     
     
    def handle_uploaded_file_np_depart(f, filename):
        repertoire_maitre = 'xxxxxxxx'
        chemin_du_repertoire = 'media/Depart/'
        repertoire_maitre = year+'/'
     
        with open(chemin_du_repertoire +'%s/%s' % (repertoire_maitre, filename), 'wb+') as destination:
            for chunk in f.chunks():
                destination.write(chunk)
    J'ai bien renseigné le champs MEDIA dans le settings.py, seulement je veux pouvoir creer des répertoires dynamiques en fonction du "num_enreg"

    Aussi, comme précisé plus haut, je veux pouvoir uploader plusieurs fichiers à partir d'un formulaire et les mettre dans un chemin spécifique, mais aussi sauvegarder les nom dans une bdd

    Merci

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 061
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 061
    Par défaut
    Bonjour,

    Je vous laisse lire cette article, puis appliquez et revenir vers nous quand vous recevrez des erreurs.

    Article Medium Uploading multiple files.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 57
    Par défaut
    Bonjour,

    Merci pour ce lien très intéressant.
    Citation Envoyé par fred1599 Voir le message

    Je vous laisse lire cette article, puis appliquez et revenir vers nous quand vous recevrez des erreurs.

    Article Medium Uploading multiple files.
    J'ai mis en œuvre ce qui y est indiqué et cela fonctionne sans erreur.

    L’inconvénient est que chaque enregistrement (lorsqu'il y a plusieurs fichiers) est inscrit dans une nouvelle ligne.

    Hors, je souhaitait un enregistrement avec plusieurs fichiers liés à celui-ci.

    J'ai trouvé mon bonheur avec ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    def depart(request):
        if request.method == 'POST':
     
            depart_form = DepartForm(request.POST, request.FILES)
     
            if depart_form.is_valid():
                doc1 = depart_form.save(commit=False)
                doc1.save()
     
                files = request.FILES.getlist('pj')
                for f in files:
                    doc1.pj.create(justificatif=f)
     
            return HttpResponseRedirect('liste_depart')
     
        else:
            depart_form = DepartForm()
     
        return render(request, 'formulaire_depart.html', {'depart_form': depart_form})
    Pour cela, j'ai modifié mon Models et passé le champs "pj" en manytomany sur le modele
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    class Insertion(models.Model):
        justificatif = models.FileField(null=True, upload_to=generate_filename, blank=True)
    Cependant (cela aurait été trop facile), avec ce dernier code, je n'arrive pas à créer de vue pour modifier celui-ci et surtout la partie PJ, afin de modifier (ajout/suppression) de fichier.

    Merci

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 061
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 061
    Par défaut
    je souhaitait un enregistrement avec plusieurs fichiers liés à celui-ci
    Je n'ai pas compris, un exemple pour exprimer cela ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 57
    Par défaut
    Bonjour,

    Désolé si je n'ai pas été très clair.

    Je reformule:

    Je souhaite un formulaire avec plusieurs champs dont un qui me permet d'insérer plusieurs fichier dans un répertoire. Ces fichiers doivent être liés à l'id du formulaire et leurs noms être enregistrés dans la bdd. (Ceux-ci sont récupéré par la suite pour être inscrit dans un fichier texte).

    Ensuite, j'ai une vue qui liste les enregistrements (sans afficher les PJ) - cette partie est ok
    Et une vue qui me permet d'afficher le détail des champs remplis avec la liste des PJ qui lui sont attachés. - une fois le bon modèle trouvé, ça devrait le faire.

    Le lien que tu m'avais envoyé me créait une ligne par fichier dans la bdd (au final je me retrouve avec pour un formulaire et 3 pj => 3 lignes) mais par la suite, comment lister l'ensemble des PJ rattaché au formulaire

    J'ai donc pensé faire un champ avec un Manytomany
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    class Depart_pj(models.Model):
        justificatif = models.FileField(null=True, upload_to=generate_filename, blank=True)
     
        def __unicode__(self):
            return unicode(self.justificatif)
     
    class Depart_m2m(models.Model):
        num_enreg = models.PositiveIntegerField(blank=True)
        date_emission = models.DateField(blank=True)
        types = models.CharField(max_length=5, blank=True)
        destinataire = models.CharField(max_length=50, blank=True)
        objet = models.CharField(max_length=100, blank=True)
        observation = models.CharField(max_length=100, blank=True)
        pj = models.ManyToManyField(Depart_pj,null=True, blank=True)
     
        def __unicode__(self):
            return unicode(self.num_enreg)
     
    forms.py
    class Departm2mForm(forms.ModelForm):
        pj = forms.FileField(required=False,widget = forms.ClearableFileInput(attrs={'multiple':True}))
        class Meta:
            model = Depart_m2m
            fields = '__all__'
            widgets = {
                'date_emission': DateInput(attrs={'class': 'datepicker', 'placeholder': 'JJ/MM/AAAA'}),
    		}
     
        def __init__(self, *args, **kwargs):
            super(Departm2mForm, self).__init__(*args, **kwargs)
            for field_name, field in self.fields.items():
                field.widget.attrs['class'] = 'form-control' 
     
    views.py
    def depart(request):
        year = datetime.now().year
     
        if request.method == 'POST':
            depart_form = Departm2mForm(request.POST, request.FILES)
     
            if depart_form.is_valid():
                doc1 = depart_form.save(commit=False)
                doc1.save()
     
                files = request.FILES.getlist('pj')
                for f in files:
                    doc1.pj.create(tjustificatif=f)
     
            return HttpResponseRedirect('liste_depart_m2m')
        else:
            depart_form = tDepartm2mForm()
        return render(request, 'depart_m2m.html', {'depart_form': depart_form})

    Avec ce code (qui fonctionne), mon problème est ensuite de faire un formulaire qui me permet de mettre à jours les PJ (et donc voir celle déjà insérés). L'utilisateur doit pouvoir supprimer/ajouter des fichiers.
    Après recherche, il apparait que la modification d'un M2M est complexe...

    Je me suis aussi orienté vers UpdateView ... sans grand succès...

    Je suis donc parti sur un systeme de ForeignKey avec le code ci-dessous (simplifié au niveau des champs):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    class Depart_pj(models.Model):
     
        observation = models.CharField(max_length=100, blank=True)
     
        def __unicode__(self):
            return unicode(self.observation)
     
     
     
    class Depart(models.Model):
        process = models.ForeignKey(Depart_pj,null=True, blank=True)
        pj = models.FileField(null=True, upload_to=generate_filename, blank=True)
     
        def __unicode__(self):
            return unicode(self.process)
     
    views.py
    def depart(request):
        year = datetime.now().year
     
        if request.method == 'POST':
     
            depart_form = DEpartForm(request.POST, request.FILES)
            obs_form = DepartObsForm(request.POST, request.FILES)
            files = request.FILES.getlist('pj')
     
     
            if depart_form.is_valid() and obs_form.is_valid():
                task=obs_form.save()
                id=str(task.id)
                print id
                files = request.FILES.getlist('pj')
                for f in files:
                    RV = Depart(process_id=id, pj=f)
                    RV.save()
     
            return HttpResponseRedirect('resultat_depart')
     
        else:
            depart_form = DepartForm()
            obs_form = DepartObsForm()
     
        return render(request, 'depart_f.html', {'depart_form': depart_form, 'obs_form':obs_form})
    En gros, je rempli "observation", recupère l'id de l'enregistrement et le passe dans le modèle Depart pour l'enregistrement des PJ. Je ne trouve pas cela très propre. Et j'ai le même problème concernant la modification/ajout de PJ.

    Peut être que ce que je souhaite n'est pas faisable en l'état, ou le faire différemment ...

    Merci

Discussions similaires

  1. [Upload] upload de plusieurs fichiers
    Par jc_cornic dans le forum Langage
    Réponses: 7
    Dernier message: 12/07/2010, 17h33
  2. [Upload] Upload de plusieurs fichiers via formulaire
    Par seb67110 dans le forum Langage
    Réponses: 2
    Dernier message: 02/05/2007, 11h55
  3. Réponses: 6
    Dernier message: 01/04/2007, 18h39
  4. Réponses: 10
    Dernier message: 12/06/2006, 16h45
  5. Réponses: 3
    Dernier message: 21/02/2006, 16h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo