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 :

Placer une valeur sur un bouton à récupérer au moment du clic [Python 3.X]


Sujet :

Django Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier Avatar de UneBelette
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2019
    Messages : 9
    Par défaut Placer une valeur sur un bouton à récupérer au moment du clic
    Bonjour/Bonsoir,

    Dans une de mes apps Django, il y a une page sur laquelle l'utilisateur accède à un bouton pour obtenir un fichier au format csv, fichier qui est écrit par une fonction et dont le contenu varie en fonction du mois en cours. J'aimerai placer une sorte "d'historique" sur cette page, permettant à l'utilisateur d'obtenir le fichier csv correspondant aux mois passés par l'intermédiaire d'une boucle créant des boutons. Seulement, et c'est logique, les boutons renvoient sur la fonction qui écrit ce fichier csv sans valeur affectant le mois qui remplit mon fichier csv.

    Ainsi, j'aimerai savoir s'il est possible de renvoyer une valeur à ma fonction à l'aide de ce bouton par l'intermédiaire de "value" par exemple. Voici mon code à l'instant présent :

    views.py
    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
    53
    54
    55
    import csv
     
    @login_required
    def export(request):
        date = datetime.datetime.now()
        mois = date.month
        mois = str(mois)
        annee = date.year
        annee = str(annee)
        nomfichier = mois + annee
     
        listemoisannee = []
        jour = date.today()
        year = jour.year
        month = jour.month
        stop = datetime.date(year, month+1, 1)
     
        date_depart = datetime.date(2019, 1, 1)  # Date de départ de l'historique
        year = date_depart.year
        month = date_depart.month
     
        while date_depart != stop:
            listemoisannee.append(date_depart.strftime("%B") + ' ' + str(date_depart.year))
            if month == 12:
                month = 1
                year = year + 1
            else:
                month = month + 1
            date_depart = datetime.date(year, month, 1)
     
        context = {
            'nomfichier': nomfichier,
            'liste': liste,
        }
        return render(request, 'export', context)
     
    @login_required
    def download_csv():
        date = datetime.datetime.now()
        mois = date.month
        mois = str(mois)
        print(mois)
        annee = date.year
        annee = str(annee)
        print(annee)
        nomfichier = mois + annee
        print(nomfichier)
        # Create the HttpResponse object with the appropriate CSV header.
        response = HttpResponse(content_type='text/csv')
        response['Content-Disposition'] = 'attachment; filename=' + nomfichier + '.csv'
     
        writer = csv.writer(response)
        ###
     
        return response
    Dans mon template :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    {% for name in listemoisannee %}
    {% buttons %}<input type="button" value="{{name}}" onclick="window.open('download_csv')">{% endbuttons %}
    {% endfor %}

    Dans urls.py :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    from django.urls import path
     
    from conge import views
     
    urlpatterns = [
        #####
        path('user/export', views.export, name='export'),
        path('user/download_csv', views.download_csv),
    ]
    J'avais l'idée de faire fonctionner la chose grâce à un "url dynamique" en plaçant une variable date dedans par exemple.

    L'idée de faire un form avec une sorte de datepicker au format mois/année est peut-être une bonne piste, elle aussi mais je ne sais pas quelle solution est la plus judicieuse.

    Si quelqu'un se sent de m'aiguiller vers une autre solution, je suis ouvert aux propositions

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 064
    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 064
    Par défaut
    Bonjour,

    Je ne suis pas sûr de tout comprendre, mais ton idée semble complexe...

    Pourquoi ne pas simplement créer un modèle représentant l'historique de tes csv ?

  3. #3
    Membre régulier Avatar de UneBelette
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2019
    Messages : 9
    Par défaut
    Un modèle pour mes csv ? Il faudrait donc que je les stocke et les affiches avec une simple requête ?

    C'est vrai que je n'y avais pas pensé puisque ma fonction 'download_csv' ne fait que le proposer à l'utilisateur sans la stocker sur le serveur. Je n'ai jamais expérimenté l'idée de lier un fichier au champ d'une table. Est-ce le fichier qui est dans le champ ou le path jusqu'à ce fichier ?

    Je vais me pencher sur l'idée demain, très certainement.

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 064
    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 064
    Par défaut
    Je croyais que tu voulais y accéder par une URL? Pourquoi ne pas stocker l'URL et la date de génération dans le modèle ?

  5. #5
    Membre régulier Avatar de UneBelette
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2019
    Messages : 9
    Par défaut
    Bien, problème résolu !

    J'ai tout d’abord commencé par me guider vers une solution proche de ce que tu m'avais proposé avec un modèle contenant l'url et les variables (dates) pour la génération du fichier. Mais en commençant à le faire, j'ai voulu essayer quelque chose de plus simple -au risque que ça fonctionne-.

    J'ai créer un form à la place du bouton de génération du fichier permettant à l'utilisateur de choisir les dates pour la génération du fichier. Je récupère simplement les valeurs à ce moment et utilise la def de création de fichier, ce qui m'évite d'avoir à stocker mes fichiers ou encore de créer un modèle.

    Voici ce que ça donne si quelqu'un en a besoin/veut s'inspirer/voir :

    views.py:
    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
    @login_required
    def download_csv(request):
        year = request.session['year']
        month = request.session['month']
     
        year = str(year)
        month= str(month)
        nomfichier = month + year
        # Create the HttpResponse object with the appropriate CSV header.
        response = HttpResponse(content_type='text/csv')
        response['Content-Disposition'] = 'attachment; filename=' + nomfichier + '.csv'
     
        writer = csv.writer(response)
        writer.writerow([month, year]) # Exemple
        return response
     
     
    @login_required
    def export(request):
        if request.method == 'POST':
            form = DateExport(request.POST)
            if form.is_valid():
                year = form.cleaned_data['year']
                month = form.cleaned_data['month']
                request.session['month'] = month  # enregistrement dans une variable de la session actuelle
                request.session['year'] = year  # enregistrement dans une variable de la session actuelle
                response = download_csv(request)
                return response
        form = DateExport()
        context = {
            'form': form,
        }
        return render(request, 'conge/export.html', context)
    forms.py :
    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
    def year_choices():
        return [(r, r) for r in range(2020, datetime.date.today().year + 1)]
     
     
    def current_year():
        return datetime.date.today().year
     
     
    class DateExport(forms.Form):
     
        MONTH_CHOICES = (
            (1, 'Janvier'),
            (2, 'Février'),
            (3, 'Mars'),
            (4, 'Avril'),
            (5, 'Mai'),
            (6, 'Juin'),
            (7, 'Juillet'),
            (8, 'Aout'),
            (9, 'Septembre'),
            (10, 'Octobre'),
            (11, 'Novembre'),
            (12, 'Décembre'),
        )
        month = forms.ChoiceField(label='Mois', choices=MONTH_CHOICES)
        year = forms.TypedChoiceField(label='Année', coerce=int, choices=year_choices, initial=current_year)
    export.html :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <form action="{% url 'export' %}" method="post">
        {% csrf_token %}
            {% bootstrap_form form %}
        {% buttons %}<button type="submit" class="btn btn-primary">Télécharger</button>{% endbuttons %}
    </form>

    Merci Fred pour ton aide bien que je n'ai pas su expliquer clairement mon problème !

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 064
    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 064
    Par défaut
    Nickel

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Placer une image sur la page en fonction d'une valeur
    Par D4rkArthemis dans le forum BIRT
    Réponses: 3
    Dernier message: 19/04/2011, 16h03
  2. récupérer une valeur depuis un bouton radio
    Par masterPage dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 28/02/2010, 11h18
  3. récupérer nombre itérations vers une valeur sur hashmap
    Par flora806 dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 26/02/2008, 14h43
  4. [Visual C++] Placer une icone sur un bouton
    Par claireP23 dans le forum Visual C++
    Réponses: 4
    Dernier message: 22/01/2008, 14h03
  5. [C#]Placer une image sur un bouton
    Par fafa139 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 06/05/2006, 20h26

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