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 :

Aide pour la création d'un formulaire


Sujet :

Django Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 41
    Par défaut Aide pour la création d'un formulaire
    Bonjour à tous,

    Je débute avec Django,et je n'arrive pas du toute à cerner la façon de m'y prendre avec ce formulaire qui me parrait pourtant simple.

    Pouvez vous me mettre sur la piste d'une solution ...

    En gros l'application a pour but de suivre le stock de mon congélateur :-) lol

    Model.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
    class HISTORIQUE(models.Model):
    	# Archive les chargements déchargement des produits localisés dans le congélateur
        produit_localise=models.ForeignKey(PRODUIT_LOCALISE, on_delete=models.CASCADE)
        qte=models.FloatField(default=None,)
     
    class PRODUIT_LOCALISE(models.Model):
    	# Créer un couple produit/lieu de stockage 
        produit=models.ForeignKey(PRODUIT_QUANTIFIE, on_delete=models.CASCADE)
        lieu_stockage=models.ForeignKey(LIEU_STOCKAGE, on_delete=models.CASCADE)
     
    class PRODUIT_QUANTIFIE(models.Model):
    	# Classifie un produit, par exemple :  VIANDE / Steack / portion, LEGUMES / Haricots verts / paquets, ...
        nom=models.CharField(max_length=120, default='',)
        famille_produit=models.ForeignKey(FAMILLE_PRODUIT, on_delete=models.CASCADE)
        type_unite=models.ForeignKey(TYPE_UNITE_PORTION, on_delete=models.CASCADE)
     
    class LIEU_STOCKAGE(models.Model):
        # Localise le stockage : petit congélo garage / grand cuisine tirroir n°2 / ...  
        nom=models.CharField(max_length=120, default='',)

    Je souhaiterai dans mon template le formulaire suivant:

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Mise à jour des stocks :
    <form>
    {% for %}
    {{ Lieu de stockage }} : [ Integerfield / initial = 0 ] {{ unite }} 
    {% end for %}
    <input Bouton Enregistrer>
    </form>

    Le but est donc de récupérer chaque valeur du champs integerfield et d'ajouter une ligne a l'historique :
    - id_produit récupéré via l'url : OK çà marche
    - unité : récupéré via l'id_produit çà marche j'ai juste besoin de l'affichage donc pas de soucis
    - Lieu de stockage : j'arrive à l'afficher mais je n'arrive pas à l'intégrer/transmettre dans le form

    Le soucis, c'est que je n'arrive pas a transmettre l'info des lieux de stockage dans le formulaire. J'ai cherché entre autre sur les formsets, les inline formsets, les hidden field, ... mais pas l'ombre d'une version fonctionnel
    Est ce mon modèle qui n'est pas adapté / mal découpé ?! Par exemple est ce que le model PRODUIT_LOCALISE est judicieux ?! Aurais je du mettre l'info du lieu dans l'historique ? Je pensais gagné en taille de données.

    Merci d'avance pour vos conseils.

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

    Revoir le tutoriel django concernant les templates, les variables ne sont pas conformes, il ne devrait pas y avoir d'espace.

    Sinon il manque des informations, comme la vue (views.py)

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 41
    Par défaut
    Bonjour Fred,

    Merci de ta réponse.
    Le bout de code n'était pas du tout valide d'un point de vue language python mais c'était plus la structure que je voulais montrer.

    Bon après quelques nuit blanches ;-) j'exagère, j'ai réussi a bien avancé.
    J'arrive a faire fonctionner mon formulaire. Le seul point ou je bloque c'est pour qu'il ait des labels egaux aux hidden inputs.
    Auriez vous une solution à me proposer ?

    Merci d'avance pour votre aide.

    models.py
    (voir 1er post)

    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
    def details_produit(request,categ_stock,id_produit,limite_nb_historique=5):
        lst_lieu_stockage=LIEU_STOCKAGE.objects.filter(categorie_stockage__slug_nom=categ_stock).order_by('nom','info_complementaire')  
        #---
        if request.method == "POST":        
            grp_form = formset_factory(VariationStockProduitQuantifie_ALocaliser)
            form = grp_form(request.POST, prefix='recup_historiq')       
            if form.is_valid():
                #On enregistre dans la BDD apres quelques test et on réaffiche la même page avec le formulaire re initialisé à 0
                for data in form.cleaned_data:
                    if data['qte']!=0:#Test si la quantitée a été modifiée
                        if PRODUIT_LOCALISE.objects.filter(produit__pk=id_produit,lieu_stockage__pk=data['id_stockage']).exists():#Test si le produit existe déjà dans la localisation voulue
                            prod_loc = PRODUIT_LOCALISE.objects.get(produit__pk=id_produit,lieu_stockage__pk=data['id_stockage'])                        
                        else:#Creation de la localisation du produit avant eregiostrement de l'historique   
                            prod_loc = PRODUIT_LOCALISE(produit=PRODUIT_QUANTIFIE.objects.get(pk=id_produit), lieu_stockage=LIEU_STOCKAGE.objects.get(pk=data['id_stockage']))
                            prod_loc.save()
                        #On creer l'enregistrement dans l'historique
                        new_histo = HISTORIQUE_CONSOMMATION(produit_localise=prod_loc, qte=data['qte'],)
                        new_histo.save()
    # ATTENTION RESTE A TESTER SI ON NE RETIRE PAS PLUS QUE LE STOCK EN COURS ! SINON LANCER UNE ERREUR...
        grp_form = formset_factory(VariationStockProduitQuantifie_ALocaliser, extra=0)
        form = grp_form(prefix='recup_historiq', initial=[{'qte':0,'id_stockage':lieu.pk,'lieux_stockage':lieu.nom,} for lieu in lst_lieu_stockage],)  #
        #--- 
        data_queryset=STOCK_PAR_STOCKAGE.objects.filter(produit_localise__produit__pk=id_produit) \
                                                .values('dt_histo__date',
                                                        'produit_localise__lieu_stockage__nom',
                                                        'produit_localise__lieu_stockage__info_complementaire',
                                                        'produit_localise__produit__type_unite__nom',) \
                                                .order_by('dt_histo__date',
                                                          'produit_localise__lieu_stockage__nom',
                                                          'produit_localise__lieu_stockage__info_complementaire',) \
                                                .annotate(lieu_stockage_affichage=Case(
                                                                                        When(produit_localise__lieu_stockage__info_complementaire='/', then='produit_localise__lieu_stockage__nom'),
                                                                                        default=Concat('produit_localise__lieu_stockage__nom',V(' - '), 'produit_localise__lieu_stockage__info_complementaire',output_field=TextField()),
                                                                                        output_field=TextField()
                                                                                        ),
                                                                                    total=Sum('qte'),
                                                                                    )
        historique_10der=HISTORIQUE_CONSOMMATION.objects.filter(produit_localise__produit__pk=id_produit).order_by('-dt_histo')[0:10]    
        info_produit=PRODUIT_LOCALISE.objects.filter(produit__pk=id_produit)[0]
        #---    
        context={'categ_stock':categ_stock,'id_produit':id_produit,'titre_page':'Détails','data_queryset':data_queryset,'lst_lieu_stockage':lst_lieu_stockage,'historique_10der':historique_10der,'form':form,'info_produit':info_produit}
        return render(request, 'suivi_stock/details_produit.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
    from django import forms
     
    from .models import HISTORIQUE_CONSOMMATION
     
    from django.utils.translation import ugettext_lazy as _
     
    class VariationStockProduitQuantifie_ALocaliser(forms.ModelForm):
        id_stockage = forms.IntegerField(widget=forms.HiddenInput(),)
        lieux_stockage = forms.CharField(widget=forms.HiddenInput(),)
        class Meta:
            model = HISTORIQUE_CONSOMMATION
            fields = ('qte', )
            labels = {
                 'qte': _('Variation '),
            }
    template : details_produit.html
    Code html : 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
    {% extends 'global_base.html' %}
    {% load static %}
     
    {% block titrepage %}<img src="{% static info_produit.produit.famille_produit.icone %}" alt="{{ icone_produit}}" height="36px">  {{ info_produit.produit.nom }}{% endblock %}
     
     
    {% block contenu %}
    <h5>Localisation et ancienneté</h5>
     
    {% regroup data_queryset by dt_histo__date as grpby_date %}
    {% for grp in grpby_date %}
    	{{ grp.grouper }}
    	<ul>
    	{% for data in grp.list %}
    		<li>{{ data.lieu_stockage_affichage }} : {{ data.total|floatformat }} {{ data.produit_localise__produit__type_unite__nom }}</li>
    	{% endfor %}
    	</ul>
    {% endfor %}
    <br/>
     
     
     
     
    <h5>Enregistrer une variation de stock</h5>
    	<form method="POST" class="post-form">{% csrf_token %}
    	{{ form.as_p }}	
    	<button type="submit" class="btn btn-info"><strong>Enregistrer</strong></button></br> 
    	</form>		
    </br>
     
     
     
    <h5>Historique des 10 dernières variations</h5>
    <ul>
    {% for entree in historique_10der %}
    	{% if entree.qte > 0 %}
    		<li>{{ entree.dt_histo|date:'d/m/Y' }} : {{ entree.produit_localise.lieu_stockage}}, <em style="color:green;">{{ entree.qte_affichage }}</em></li>
    	{% else %}
    		<li>{{ entree.dt_histo|date:'d/m/Y' }} : {{ entree.produit_localise.lieu_stockage}}, <em style="color:red;">{{ entree.qte_affichage }}</em></li>
    	{% endif %}
    {% endfor %}
    </ul>
     
    {% endblock %}

    Je vous remercie d'avance pour votre aide.

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    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 062
    Par défaut
    Citation Envoyé par pinpom Voir le message
    Bonjour Fred,

    Le seul point ou je bloque c'est pour qu'il ait des labels egaux aux hidden inputs.
    Auriez vous une solution à me proposer ?
    Bonjour,

    On a quand même beaucoup de mal à vous comprendre

    Vous parlez des labels dans la classe META de votre formulaire VariationStockProduitQuantifie_ALocaliser ?

    Si c'est ce que je pense, c'est simplement du formatage de chaîne qui est une fonctionnalité vraiment de base du langage Python.

    Merci de mieux exprimer le problème.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 41
    Par défaut
    Bonjour Fred,

    Alors, pour être plus claire, je vais partir sur un exemple concret, je pense que j'arriverai plus facilement a exprimer mon besoin.


    INGREDIENT_QUANTIFIE : Glace au chocolat / pot(s) individuel
    LIEUX_STOCKAGE possible associé à l’ingrédient quantifié : Congélateur garage, Congélateur cuisine, Freezer cuisine


    Mon objectif c'est d'avoir un unique formulaire (1 seul bouton enregistrer) qui génère autant de ligne que de lieux de stockage possible pour un ingrédient donné.
    On a donc dans cette exemple :

    Rendu de la page HTML souhaitée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Mettre à jour les stock de Glace au chocolat :
    * Congélateur garage, variation : [champ qte du formulaire ] pot(s) individuel
    * Congélateur cuisine, variation : [champ qte du formulaire ] pot(s) individuel
    * Freezer cuisine, variation : [champ qte du formulaire ] pot(s) individuel
    ENREGISTRER
    Moi avec le code que j'ai réussi a faire, j'ai bien mon formulaire fonctionnel, en effet grâce id_stockage = forms.IntegerField(widget=forms.HiddenInput(),) dans mon forms.py j'arrive à mettre correctement à jour les bons compteurs, mais visuellement dans le template je n'arrive pas à afficher les titres des lieux de stockages ni les unités d'ailleurs.
    j'ai cet affichage :

    Rendu de la page HTML obtenue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Mettre à jour les stock de Glace au chocolat :
    * Variation : [champ qte du formulaire ] 
    * Variation : [champ qte du formulaire ] 
    * Variation : [champ qte du formulaire ] 
    ENREGISTRER
    La ou je bloque c'est que je n'arrive pas à imaginer la façon de faire une boucle sur les lieux de stockage en même temps que sur les formulaires.

    J'espère que j'ai été plus claire avec l'exemple.

    En tout cas merci de t'être penché sur mon soucis.

    Bonne journée.

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    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 062
    Par défaut
    Ton code est difficilement lisible, j'aurai pas trop de difficulté à dire que ça devrait être facile de faire plus simple...

    Bref, j'ai des doutes sur la ligne 6 de ta vue, car si je comprends bien, tu dois récupérer l'ensemble des data['qte'] dans chaque formulaire.

    form devrait s'écrire formset et tu devrais boucler sur formset pour récupérer chaque data

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    formset = grp_form(request.POST, prefix='recup_historiq')
    for form in formset:
        if form.has_changed():
            data = form.cleaned_data['qte']
            # suite
    Je fais ça à l'aveugle, car c'est très peu lisible tout ça... il y a des chances que je passe à côté de beaucoup de choses.

Discussions similaires

  1. Aide pour la création d'un formulaire avec listes évolutives
    Par aut0wash dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 04/12/2017, 22h27
  2. Réponses: 1
    Dernier message: 17/05/2006, 15h27
  3. Réponses: 2
    Dernier message: 10/03/2006, 13h55
  4. Aide pour un alignement dans un formulaire
    Par Death83 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 16/08/2005, 14h13
  5. [Oracle] Aide pour la création d'un trigger
    Par Sonic dans le forum Administration
    Réponses: 14
    Dernier message: 04/11/2004, 19h54

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