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 base de donnée et clé étrangère


Sujet :

Django Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 22
    Par défaut Problème base de donnée et clé étrangère
    Bonjour à tous.
    Veuillez m’excuser si je pose une question complètement idiote ou irrationnelle, mais je débute en programmation et Python + Django sont mes premiers outils...
    Je souhaite donc développer un petit site internet pour m’entraîner.

    J'ai un système de blog sur mon site internet, et un système de commentaire que peuvent poster les utilisateurs. Malheureusement, je n'arrive pas à lier automatiquement le commentaire à l'article. Pour que cela fonctionne, je suis obliger de rajouter un champs dans le formulaire pour que l'utilisateur rajoute à quel article fait référence le commentaire qu'il post.

    C'est bien évidemment idiot, le visiteur commente l'article qu'il lit, il ne dois pas spécifier l'article. Cependant je n'arrive pas à remplir le champs correspondant à ma clé étrangère.

    Voici le code de mon fichier blog/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
    # -*- coding: utf-8 -*-
    from django.http import HttpResponse, Http404, HttpResponseRedirect
    from django.shortcuts import redirect, render_to_response, render
    from blog.models import Article, Categorie, Commentaire_Article
    from django.contrib.auth.models import User
    from blog.forms import Commentaire_ArticleForm
    from django.core.context_processors import csrf
    from django.contrib.auth import authenticate
     
    def accueil(request):
        """ Afficher tous les articles du blog """
        articles = Article.objects.all().order_by('-date') # On sélectionne tous nos articles
        return render(request,'blog/blog.html',{'derniers_articles':articles})
     
    def lire(request, id, slug):
     
    #On sélectionne l'article dont l'id à été choisi
        try:
            article = Article.objects.get(id=id)
        except Article.DoesNotExist:
            raise Http404
    #---------------------------------------------
    #On affiche les commentaires de l'article
        commentaires_article=Commentaire_Article.objects.filter(article=id)
    #--------------------------------------------- 
    #On affiche le formulaire pour rajouter des commentaires
        if request.method=='POST':
            form=Commentaire_ArticleForm(request.POST)          
            if form.is_valid():
                titre=request.POST.get('titre')
                contenu=request.POST.get('contenu')
                article_commente=article.titre
                Commentaire_Article(titre=titre, contenu=contenu, article=article_commente).save()
     
                return render(request,'blog/commenter.html')
        else:
            form=Commentaire_ArticleForm()
    #---------------------------------------------
        return render(request,'blog/lire.html',{'article':article, 'commentaires':commentaires_article,'form':form})
    Le code du models en lien: blog/models.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
     
    from django.db import models
    from django.contrib import admin
     
    class Categorie(models.Model):
        nom = models.CharField(max_length=30)
        def __unicode__(self):
            return self.nom
     
    class Article(models.Model):
        titre = models.CharField(max_length=100)
        slug = models.SlugField(max_length=100)
        contenu = models.TextField(null=True)
        date = models.DateTimeField(auto_now_add=True, auto_now=False,verbose_name="Date de parution")
        categorie = models.ForeignKey(Categorie)
        def __unicode__(self):
            return u"%s" % self.titre
     
     
    class Commentaire_Article(models.Model):
        titre = models.CharField(max_length=100)
        auteur = models.CharField(max_length=50)   
        contenu = models.TextField(null=True)
        date = models.DateTimeField(auto_now_add=True, auto_now=False, verbose_name="Date de parution")
        article = models.ForeignKey(Article)
        def __unicode__(self):
            return u"%s" % self.titre
    Et enfin, et peut-être le plus important, le message d'erreur est le suivant:


    ValueError at /blog/article/4-4eme-article/
    Cannot assign "'4eme article'": "Commentaire_Article.article" must be a "Article" instance.
    Request Method: POST
    Request URL: http://localhost:8000/blog/article/4-4eme-article/
    Django Version: 1.5.4
    Exception Type: ValueError
    Exception Value:
    Cannot assign "'4eme article'": "Commentaire_Article.article" must be a "Article" instance.


    Je me doute bien que mon erreur est ici, mais cela ne m'aide pas à trouver une solution...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    article_commente=article.titre
    Commentaire_Article(titre=titre, contenu=contenu, article=article_commente).save()
    Mais comment faire... je vous remercie d'avance pour tous les conseils que vous aller me donner pour régler le problème, merci

    Clément

  2. #2
    Membre expérimenté Avatar de Stopher
    Homme Profil pro
    Responsable technique
    Inscrit en
    Juin 2004
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Responsable technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 198
    Par défaut
    Salut ,

    As tu essayé d'utiliser le type "ForeignKey" pour le champ article dans ton model commentaires ?

    https://docs.djangoproject.com/en/de...ds/#foreignkey

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    article = models.ForeignKey( 'Article' )
    Ch.

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 22
    Par défaut
    Bonjour,

    si tu parles de la ligne 25 de blog/models.py, il s'agit d'une erreur de ma part lors de la rédaction du post.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        article = models.ForeignKey(Article)
    J'ai édité mon premier post.

    Et je cherche toujours une solution. Je vous tiens au courant de mes avancées.

    Edit : j'ai également tester cela dans mon blog/views.py ligne 32:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    article_commente=article.id

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 159
    Par défaut
    Citation Envoyé par GrimaudClement Voir le message
    Edit : j'ai également tester cela dans mon blog/views.py ligne 32:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    article_commente=article.id
    Hello,

    Il faut passer directement l'instance d'article (ni son titre, ni son id)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    article_commente=article
    edit:
    Petit truc en passant, après une requête POST réussie, il vaut mieux faire une redirection, voir http://fr.wikipedia.org/wiki/Post-Redirect-Get

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 22
    Par défaut
    Merci valAa pour ta réponse, cela fonctionne parfaitement.
    Pour ce qui est de la requête POST réussie, je te remercie de l'information. Je regarde ce soir comment faire cela et je reviens te voir si j'ai des soucis.

    Merci à vous, sujet résolu

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 159
    Par défaut
    Hello,
    Pour la redirection après un POST, le pattern classique dans une vue django est le suivant.

    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
     
    from django import redirect
    from django.contrib import messages
     
    def my_view(request):
        if request.method == 'POST':
            form = MyForm(request.POST)
            if form.is_valid():
                form.save()
                # si le middleware "messages" est utilisé, profitons
                # en pour informer l'utilisateur
                messages.success(request, 'Form saved')
                # on redirige vers une vue (qui peut être celle ci)
                # pour éviter que le formulaire ne soit soumis plusieurs fois.
                return shortcuts.redirect("some_view")
        else:
            form = MyForm()
     
        # ici nous avons
        #    - soit un form vide (à remplir par l'utilisateur)
        #    - soit un form contenant des erreurs de validation 
        #      (à re-remplir et re-soumettre)
        # On affiche donc le template. 
        return shortcuts.render(
            request,
            'my_template.html',
            dict(form=form),
            )

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

Discussions similaires

  1. Problème base de donnée
    Par dispa dans le forum Windows Forms
    Réponses: 1
    Dernier message: 22/01/2008, 23h13
  2. problème base de donnée access
    Par Phiss dans le forum ASP
    Réponses: 6
    Dernier message: 21/11/2007, 22h15
  3. Problème base de données Microsoft Jet
    Par lilo415 dans le forum Access
    Réponses: 2
    Dernier message: 11/10/2007, 00h23
  4. Problème Base de donnée
    Par quedudev dans le forum C++Builder
    Réponses: 3
    Dernier message: 27/09/2007, 13h44
  5. Problème Base de données et CRecordSet
    Par LE CHAKAL dans le forum MFC
    Réponses: 3
    Dernier message: 20/08/2002, 12h59

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