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 :

Problème INSERTION de données dans une bdd


Sujet :

Django Python

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 43
    Points : 27
    Points
    27
    Par défaut Problème INSERTION de données dans une bdd
    Bonjour à tous ! Et oui c'est encore moi...

    Je commence tout juste à essayer d'interagir avec une base de données à partir de mon programme. Et là j'aurais besoin d'explications. J'ai lu pas mal de choses mais je n'arrive pas à mettre en œuvre. Juste pour l'entrainement, j'ai créé une table patient que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class Patient(models.Model):
        nom = models.CharField(max_length=100)
        prenom = models.CharField(max_length=100)
        cp = models.ForeignKey('Nomenclature', limit_choices_to = {'typeN__exact': 'cp'}, related_name="a")
    Et voici mon template contenant le formulaire permettant l'ajout d'un patient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ......
    <form action="/application/add_patient" method="post">
           Nom : <input type="text" name="nom">
           Prenom : <input type="text" name="prenom">
           Code postal : <input type="text" name="cp">
           <input type="submit" value="Enregistrer">
    </form>
    Et enfin voilà ma vue "add_patient" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    def add_patient(request):
        PatientForm = forms.form_for_model(Patient)
        if request.method == 'POST':
            form = PatientForm(request.POST)
            if form.is_valid():
                data = form.clean_data
                patient = Patient()
                patient.nom = data['nom']
                patient.prenom = data['prenom']
                patient.save()
    Mais je n'y arrive pas ! Et oui je sais que pour vous c'est d'une facilité déconcertante mais voilà je suis totalement perdu avec django.

    Merci de votre aide

  2. #2
    Membre habitué

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 116
    Points : 144
    Points
    144
    Par défaut
    As-tu fait le tutoriel d'introduction ?

    http://docs.djangoproject.com/en/dev/intro/tutorial01/

  3. #3
    Nouveau membre du Club
    Inscrit en
    Janvier 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 43
    Points : 27
    Points
    27
    Par défaut
    Bonjour Sinclair !
    C'est la première chose que j'ai faite d'ailleurs pour me mettre à django.
    Seulement, ça ne m'aide pas beaucoup dans mon cas car c'est assez différent je trouve. Du coup j'ai essayé d'aller voir d'autres exemples et je suis arrivé au résultat que l'on voit plus haut. Mais j'ai cette erreur :

    AttributeError at /application/add_patient/

    'module' object has no attribute 'form_for_model'

    Moi pas comprendre
    Une idée ? Merci de sacrifier de votre temps.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Janvier 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 43
    Points : 27
    Points
    27
    Par défaut
    Re-Bonjour à tous

    Bon et bien je crois que j'ai trouvé comment faire. Voici ce qu'est devenu ma vue "add_patient" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    def add_patient(request):
    nom = request.POST.get('nom','')
    prenom = request.POST.get('prenom','')
    cp = request.POST.get('cp','')
     
    patient = Patient(nom=nom, prenom=prenom, cp=cp, ....
    Pour "nom" et "prenom" il n'y a pas de problème mais pour "cp" par contre ça ne fonctionne pas car en fait le champ "cp" de la table "Patient" et clé étrangère du champ "typeN" de la table "Nomenclature" (cf nomenclature.jpg + class "Patient" en post1). Mon formulaire est le même (post1). Quand je met, par exemple, "29000" dans le champ du code postal et que je valide, j'ai cette erreur :

    ValueError at /application/add_patient/
    Cannot assign "u'29000'": "Patient.cp" must be a "Nomenclature" instance.
    Je comprend l'erreur mais je ne sais pas comment y remédier. J'aimerais que si je mais "29000", et bien le champ "cp" de la table "Patient" comporte l'id de la nomenclature correspondante (ici donc "1", si je met "29170"--->cp="3").

    Je sais que mes explications sont longues mais j'essaie de faire en sorte que vous compreniez.

    Je vous remercie vraiment pour votre aide.

    kiradeus
    Images attachées Images attachées  

  5. #5
    Membre régulier
    Profil pro
    Développeur Back-End
    Inscrit en
    Septembre 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Septembre 2007
    Messages : 81
    Points : 106
    Points
    106
    Par défaut une idée
    Salut
    Essaye aussi les vues génériques.
    un exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    from django.views.generic.create_update import delete_object, create_object, update_object
    def creation(request):
     return create_object(request, model=TonModel,template_name='tonTemplate.html',
                      extra_context={},post_save_redirect=rediriger_apres_sauvegarde,
                      login_required=True,context_processors=None, form_class=Formulairedumodel)

  6. #6
    Nouveau membre du Club
    Inscrit en
    Janvier 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 43
    Points : 27
    Points
    27
    Par défaut
    Salut malick021988 !

    Je n'est pas encore utilisé de vues génériques car j'ai du mal à comprendre en fait. Mais tu as raison je dois faire comme ça car beaucoup de code en moins déjà je suppose donc je vais m'y mettre. Du coup je ne vois pas encore comment utiliser ce que tu as mis en exemple mais je vais essayer et je te tiens au courant.

    En tout cas vraiment merci pour ton aide

  7. #7
    Nouveau membre du Club
    Inscrit en
    Janvier 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 43
    Points : 27
    Points
    27
    Par défaut
    J'ai essayé d'utiliser les vues génériques mais j'ai un problème avec template_name. il ne semble pas prendre en compte ce critère.

    Effectivement, il me dirige vers la page par défaut, celle qu'il affiche si on ne renseigne pas template_name (c'est-à-dire <app_label>/<model_name>_form.html).
    Pourtant je l'ai mit ce template_name !! J'ai dû oublier quelque chose. Voici mon code :

    (vue : create)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    def create(request):
        return create_object(request,model=Patient,
        template_name='application/patient/form_ajout.html',extra_context={},
        login_required=True, context_processors=None)
    (mon urls.py)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    from django.views.generic import list_detail, create_update, date_based
     
    patient_info = {'model' : Patient}
    urlpatterns = patterns('RelaiSeniors.application.views',
    (r'^patient/create/$', create_update.create_object, patient_info),
    ...
    J'espère que vous pourrez m'aider . Merci.

  8. #8
    Nouveau membre du Club
    Inscrit en
    Janvier 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 43
    Points : 27
    Points
    27
    Par défaut
    Personne pour m'aider ?

    J'ai beau lire et relire l'annexe D du djangobook fr mais je n'arrive pas à ajouter des données à ma base de données. J'ai vraiment besoin d'un sérieux coup de main car ça me freine dans mon projet que je dois finir dans une semaine donc...

    Merci d'avance pour votre aide

  9. #9
    Membre régulier
    Profil pro
    Développeur Back-End
    Inscrit en
    Septembre 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Septembre 2007
    Messages : 81
    Points : 106
    Points
    106
    Par défaut
    Salut
    essaye de lire le code de la fonction. ça m'aide quelque fois.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    return create_object(request, model=Redaction,template_name='damware/redacindex.html',
                      extra_context={},post_save_redirect='/',
                      login_required=True,context_processors=None, form_class=RedactionForm)
    compare les deux codes.
    j'espère que ça va t'aider.
    Merci

  10. #10
    Nouveau membre du Club
    Inscrit en
    Janvier 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 43
    Points : 27
    Points
    27
    Par défaut
    Bonjour à tous !

    Désolé de répondre que maintenant mais j'essayais de me débrouiller un peu seul et ne pas abuser de votre aide pour résoudre mon problème.
    J'ai suivi ton conseil malick021988 et je me suis durement mis aux vues génériques et notamment la vue générique de création d'objet que fournit django.
    Voilà ce que ça donne :

    urls.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    patient_info = {
        "model" : Patient
    }
     
    urlpatterns = patterns('',
    ...
    (r'^patient/create/$', 'django.views.generic.create_update.create_object', dict(patient_info, template_name='application/patient/form_patient.html'), 'patient_create'),
    Et mon template :

    form_patient.html
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <form action="." method="post">
         <label for="id_nom">Nom :</label> {{ form.nom }}
         <label for="id_prenom">Prenom :</label> {{ form.prenom }}
    </form>
    Et l'insertion ne marche toujours pas
    Mais je ne perd pas espoir ! Et oui il faut être optimiste !
    Juste j'aimerais avoir votre avis et savoir si je suis sur la bonne voie.

    Merci vraiment tout le monde

  11. #11
    Membre régulier
    Profil pro
    Développeur Back-End
    Inscrit en
    Septembre 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Septembre 2007
    Messages : 81
    Points : 106
    Points
    106
    Par défaut
    Mon url
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    from myapp.views import add_patient
    url(r'^patient/add/$',add_patient,name='add-patient'),
    Formulaire (forms.py)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    from myapp.models import Patient
    from django import forms
     
    class PatientForm(forms.ModelForm):
     model=Patient
    Ma vue 'add_patient'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    from myapp.forms import PatientForm
    from myapp.models import Patient
    from django.views.generic.create_update import create_object
     
    def add_patient(request):
      return  create_object(request, model=Patient, template_name=add_patient.html,
            template_loader=loader, extra_context=None, post_save_redirect='/',
            login_required=False, context_processors=None, form_class=PatientForm)

  12. #12
    Nouveau membre du Club
    Inscrit en
    Janvier 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 43
    Points : 27
    Points
    27
    Par défaut
    Bonjour malick021988 !

    J'ai essayé de faire de la manière que tu m'as indiqué et j'ai une erreur.
    Voici le lien vers l'erreur : http://dpaste.com/159501/

    Une idée de ce qui ne va pas ?
    Merci de votre aide.

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,
    Je ne me souviens plus de l'ORM qu'il y a derrière le Model, mais si CP est une FK, il faut récupérer l'enregistrement Nomenclature correspondant au cp entré par l'utilisateur (une chaine de caractères).
    => A condition que celui ci existe bien sûr.
    Ce qui devrait donner le code:
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def add_patient(request):
        nom = request.POST.get('nom','')
        prenom = request.POST.get('prenom','')
        cp = request.POST.get('cp','')
        # récupérer la nomenclature correspondante au cp
        nomenclature = Nomenclature(cp=cp)
        # dire que cp est "nomeclature" pour qu'il récupère la FK
        patient = Patient(nom=nom, prenom=prenom, cp=nomenclature, ....
    Mais, c'est intuitif....
    Cordialement,
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 07/01/2013, 08h12
  2. [Débutant] Problème d'insertion de données dans une BDD sqlserver ce
    Par chinwya dans le forum VB.NET
    Réponses: 2
    Dernier message: 24/07/2012, 12h29
  3. [MySQL] Problème insertion de données dans une table (via formulaire)
    Par bond70 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 23/04/2010, 16h48
  4. Insertion de données dans une BDD Access
    Par LeMeD dans le forum VB.NET
    Réponses: 2
    Dernier message: 25/01/2010, 16h43
  5. Insertion de données dans une BDD Oracle avec VB.NET
    Par DashRendar dans le forum Accès aux données
    Réponses: 7
    Dernier message: 23/01/2008, 08h47

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