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 :

Récupérer les données d'un formulaire dynamique dans la base de données après validation [Python 3.X]


Sujet :

Django Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2020
    Messages : 2
    Par défaut Récupérer les données d'un formulaire dynamique dans la base de données après validation
    Salut !

    J'ai une préoccupation, si vous pouvez m'aider.

    Dans un fichier index.html j'ai un formulaire dont les données sont les questions (affichées dynamiquement en parcourront la table Question via la boucle for), je veux valider ce formulaire et stocké les réponses dans la base de données.

    J’attribue 'IDENTIFIANT' de la table Question au NAME des INPUT (qui sont des réponses à la question), ce qui fait que pour la question 1 on aura :

    Par exemple
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <input type="radio" name="1"/>Oui
    <input type="radio" name="1"/>Non

    Et ainsi de suite pour les questions 2, 3, 4, etc.

    La difficulté que je rencontre c'est de récupérer ce NAME dans un autre fichier nommé views.py afin d'enregistrer les données.

    On aura : reply=http_request.POST['Ici on doit récupérer le contenu du NAME'].

    Exemple :

    reply=http_request.POST['choice'] ou reply=http_request.POST['1'].

    Sauf que le contenu du NAME n'est pas statique dans mon cas.


    N.B : Je n'ai pas voulu utilisé la class Form de django, parce que j'ai trop de condition à faire dans ce formulaire.



    Voici le code du fichier index.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
    <form method="POST" action="{% url 'reviews:index'%}" name="form" class="form mx-auto mt-2 pb-5">
    	{% csrf_token %}
     
     
    				          {% for q in question %}
     
    						<div class="mb-5">
    							<ul class="text-info"> {{ q.question_text }}</ul>
     
     
    							<div class="form-check form-check-inline">
    								<ul class="mb-1">
    								      <input class="form-check-input perso_style" type="radio" name="{{ q.id }}_boolean" id="txt1" value="1" required/>
    								      <label class="form-check-label text-light" for="txt1"> <!-- True -->
    									        Oui
    								      </label>
    								      <input class="form-check-input perso_style" type="radio" name="{{ q.id }}_boolean" id="txt2" value="0" required/>
    								      <label class="form-check-label text-light" for="txt2"> <!-- False -->
    										Non
    								      </label>
    								      <input type="hidden" name="{{ q.id }}_id" value="{{ q.id }}"/>
    								</ul>
     
     
    							</div>
     
    						</div>
     
     
    					{% endfor %}
                                                   <input type="submit" class="btn btn-primary mx-auto d-block mt-5" value="Terminé" />
     
    </form>

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 049
    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 049
    Par défaut
    À vue de nez ça ne semble pas être un problème Django ou Python, mais lié à l'utilisation de HTML.

    Pourquoi récupérer l'attribut name quand on sait que la valeur récupérée sera "1" ? Qu'est-ce qu'on va en faire ?

    Il faudrait appliquer une valeur à chacun des radio boutons afin de pouvoir reconnaître quel est celui choisi...

    Exemple,

    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <input type="radio" name="1" value="Y"/>Oui
    <input type="radio" name="1" value="N"/>Non

    et récupérer l'attribut value

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2020
    Messages : 2
    Par défaut Résolue
    Salut fred1599

    C'est un formulaire dynamique, donc les valeurs du champ NAME de l'input vont variées par rapport aux d'enregistrement dans la table Question. Grosso modo on aura dans le fichier index.html :

    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    <input name="question_{{ q.id }}" />

    Les valeurs du NAME seront donc : question_1, question_2, question_3, etc.


    J'ai pu résoudre le problème, dans la fonction index du fichier 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
    def index(http_request): 
     
        if http_request.method == "POST":
            # récupérer les infos et les enregistrer
            for key, value in http_request.POST.items(): # Sur cette ligne key récupére le name (id de la question) de l'input et value récupére value de l'input
                if key.startswith("question_"):   # Si key comment par "question_" tel que défini dans le fichier index.html
                    try:
     
                        question = Question.objects.get(id=key[9:]) # On récupére  les enregistrement de la table Question dont les identifiant sont 1, 2, 3 (key[9:] ne récupére  que l'entier contenu dans la variable key).
     
                       nreply = NumericalReply.objects.create(question=question, reply=value) # On enregistre l'id de la question, ainsi que la réponse dans la table NumericalReply qui lié à la table Question.
     
                    except Question.DoesNotExist:
                        print("Question", key[9:], "n'existe pas ! ")
    Merci tout de même pour ta réponse !

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

Discussions similaires

  1. récupérer les résultats d'une commande linux dans une base de données
    Par fatimazahra kachiri dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 09/04/2014, 13h14
  2. Réponses: 27
    Dernier message: 20/01/2010, 11h39
  3. [OpenOffice][Base de données] Récupérer les données aprés sélection dans une combobox
    Par frack dans le forum OpenOffice & LibreOffice
    Réponses: 1
    Dernier message: 06/02/2009, 09h27
  4. Récupérer les données après validation
    Par nesswaw dans le forum CodeIgniter
    Réponses: 1
    Dernier message: 31/01/2009, 15h02
  5. récupérer les valeurs d'un formulaire dynamique
    Par une_tite_question dans le forum Langage
    Réponses: 4
    Dernier message: 05/08/2008, 16h06

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