Partage
  • Partager sur Facebook
  • Partager sur Twitter

Exercices du cours Django / Vos questions

    8 décembre 2014 à 16:32:23

    Ça marche maintenant, je vais enfin pouvoir m'amuser.

    Cependant après avoir essayé de créer d'autres projets, je m'aperçois que je dois rajouter sys.path.append("/usr/local/lib/python3.4/dist-packages") dans le fichier manage.py. (Peut être pas très normal ça...) puis lancer python manage.py migrate avant de lancer python manage.py runserver.

    Je ne suis pas du métier, si quelqu'un a une solution plus éclairée ça m’intéresse.

    Beurre demi sel bien sûr !

    • Partager sur Facebook
    • Partager sur Twitter
      16 décembre 2014 à 17:17:00

      Bonjour,

      Je viens vers vous car j'ai un problème lors de l'installation de Django.

      Il faut savoir que j'avais déjà installer ultérieurement Python27.

      J'ai donc supprimer les dossiers et installer Python34 sauf que je n'ais toujours pas le répertoire : "Python34\Lib\site-packages\django\bin\"

      je peux aller dans "site-package" mais je ne possède pas le dossier django.

      Comment je peux faire s'il vous plait ?

      • Partager sur Facebook
      • Partager sur Twitter
        19 décembre 2014 à 14:11:35

        Bonjour, je suis sur le cours à la partie 2.6. J'utilise Ubuntu 14.04 et je suis dans un environnement de travail en Python 3.4 et Django 1.7.1

        Mes photos s'enregistrent à la racine de mon disque dur dans /media/photos au lieu de lien/vers/mon/dossier/crepes_bretonnes/media/photos/

        Pourtant dans mon settings.py j'ai bien ces lignes :

        BASE_DIR = os.path.dirname(os.path.dirname(__file__))

        MEDIA_ROOT = os.path.join(BASE_DIR, '/media/')
        MEDIA_URL  = MEDIA_ROOT

        Savez-vous si c'est normal ou comment résoudre ce problème ?

        -
        Edité par lydstyl 19 décembre 2014 à 17:20:32

        • Partager sur Facebook
        • Partager sur Twitter
          19 décembre 2014 à 18:24:53

          Salut lydstyl

          Essai d'enlever le premier "/" car BASE_DIR te place déjà à la racine de ton projet.

          En production par contre c'est la version avec le "/" qui sera utilisée.

          MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
          MEDIA_URL  = '/static/'

          Bonne continuation...

          -
          Edité par luckyfof 19 décembre 2014 à 18:25:38

          • Partager sur Facebook
          • Partager sur Twitter
            19 décembre 2014 à 21:51:41

            thornac a écrit:


            J'ai donc supprimer les dossiers et installer Python34 sauf que je n'ais toujours pas le répertoire : "Python34\Lib\site-packages\django\bin\"

            je peux aller dans "site-package" mais je ne possède pas le dossier django.

            Comment je peux faire s'il vous plait ?

            Bonjour, cela relève plutôt d'un problème de Python : essayez de voir si Django ne s'est pas installé dans un autre dossier (il est bien quelque part !) et de le déplacer dans le sites-packages de Python3.4.

            @lydstyl : Comme dit par mon voisin du dessus, il ne faut pas de / au début du second argument de os.path.join, sinon la concaténation ne marchera pas :)

            • Partager sur Facebook
            • Partager sur Twitter
              20 décembre 2014 à 9:38:57

              @luckyfof et @Ssx`z : merci ça fonctionne :-) par contre j'ai mis "MEDIA_URL = MEDIA_ROOT" et non "MEDIA_URL  = '/static/'" car sinon comme j'ai "STATIC_URL = '/static/'", j'obtiens l'erreur suivante quand je lance python manage.py runserver :
              "django.core.exceptions.ImproperlyConfigured: The MEDIA_URL and STATIC_URL settings must have different values"
              • Partager sur Facebook
              • Partager sur Twitter
                20 décembre 2014 à 9:42:50

                Oui, ce n'est pas static mais media plutôt que l'on met : MEDIA_URL = '/media/'

                De cette façon, localhost:8000/static va renvoyer les fichiers statiques (CSS, JS, images du site...) et localhost:8000/media pointera vers le MEDIA_ROOT, c'est à dire les fichiers uploadés via les FileField entre autres.

                • Partager sur Facebook
                • Partager sur Twitter
                  25 décembre 2014 à 6:53:47

                  Bonjour tout le monde

                  J'ai petit problème sur la classe LireArticle(DetailView).
                  Comment faire dans le cas du blog pour afficher les commentaires et le formulaire d'envois de commentaire.
                  Voici la section code python du cours merci d'avance pour votre aide précieuse.

                  Dans la partie 3 du cours techniques avancés / Les vues générique

                  class LireArticle(DetailView):
                      context_object_name = 'article'
                      model = Article
                      template_name = 'blog/lire_article.html'


                  Je suis vraiment bloqué et j'aimerai finir ce cours

                  • Partager sur Facebook
                  • Partager sur Twitter
                    25 décembre 2014 à 12:43:56

                    Bonjour luckyfof,

                    On ne l'a pas expliqué dans le cours car pour ma part, je préfère utiliser des vues "classiques" dans cette situation. C'est une question de goût, mais je trouve qu'une vue générique devient mon lisible quand on lui ajoute des spécificités de la sorte. En tout cas, c'est possible, en surchargeant la méthode get_context_data !
                    Voici un petit exemple :

                    class LireArticle(DetailView):
                        context_object_name = "article"
                        model = Article
                        template_name = "blog/lire.html"
                    
                        def get_context_data(self, **kwargs):
                            """ On récupère des données supplémentaires à intégrer au template """
                            # On appelle le parent pour qu'il fasse le travail habituel
                            context = super(LireArticle, self).get_context_data(**kwargs)
                            
                            # On récupère le formulaire et les commentaires
                            context['form'] = CommentaireForm()
                            context['commentaires'] = Commentaire.objects.filter(article=self.article)
                            return context

                    Pour les commentaires, j'ai décidé de les récupérer ici via le code Python, mais sachez qu'il est possible des les récupérer via article.commentaire_set.all dans le template, comme on l'a vu dans le chapitre sur les modèles (Partie 2) ;)

                    • Partager sur Facebook
                    • Partager sur Twitter
                      25 décembre 2014 à 16:58:57

                      Merci beaucoup, je pensai à un oubli de votre par dans le cours.

                      Je vois qu'on peut passer à la suite et ce sont des options avancées.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        25 décembre 2014 à 23:30:48

                        Bonsoir,

                        Merci pour ce cours on prend vraiment plaisir à le suivre.

                        Je suis rendu à l'exercice du raccourcisseur d'url que j'ai effectué avec succès cependant un point de ma méthode diffère avec la correction.

                        J'ai déclarer la fonction generer dans ma vue et ai utilisé ce code pour enregistrer l'url :

                        def SetUrl(request):
                            if request.method == 'POST':  
                                form = UrlForm(request.POST)  
                        
                                if form.is_valid(): 
                                    code = generer(4)  
                                    saveurl =  form.save(commit=False)
                                    saveurl.code = code
                                    saveurl.save()
                                    form = UrlForm()
                                    envoi = True        
                            else: 
                                form = UrlForm()  
                        
                            return render(request, 'url/seturl.html', locals())


                        J'ai compris que le but de la fonction save() dans le model est de modifier le comportement de la sauvegarde dans la bdd mais je ne comprend pas ce qui est effectuer à l’intérieur. J'ai été obliger d'utiliser le commit=false pour pouvoir inclure le code généré dans ma sauvegarde étant donner que le champ n'était pas dans le formulaire( je me suis réferer au cours pour cela), mais dans la correction cette méthode n'est pas utilisée , un simple form.save() est appelé dans la vue et le reste se passe dans cette fameuse fonction.

                        def save(self, *args, **kwargs):
                                if self.pk is None:
                                    self.generer(6)
                        
                                super(MiniURL, self).save(*args, **kwargs)



                        Je me demander aussi, j'utilise le form = UrlForm() pour formater le formulaire lors du retour à la page avec le render mais cela n'efface pas les paramètres POST donc si on actualise le requête est regénérée, je ne voulais pas utiliser le redirect() car sinon je ne peux pas générer un message de confirmation dans mon template avec

                        {% if envoi %}Votre lien a été génerer, nouvel accès http://localhost:8000/{{ code }}{% endif %}

                         Comment faire pour gérer ce problème de renvoi de requête, dois-je effacer les données du POST?

                        Merci de votre aide.

                        -
                        Edité par V1ce 25 décembre 2014 à 23:45:44

                        • Partager sur Facebook
                        • Partager sur Twitter
                          26 décembre 2014 à 11:23:38

                          Bonjour !

                          Bravo pour avoir réussi le premier TP :) On n'attend pas forcément notre solution du premier coup, il y a plusieurs manières de faire.

                          Pour la fonction generer, nous l'a déclarons dans le modèle car elle n'est utilisé que par le modèle en réalité et il faut éviter de caser des fonctions utilitaires/fourre-tout dans les vues, pour garder un maximum de lisibilité. Dans votre version, vous générez un code et vous l'assignez ensuite à votre objet. L'utilisation de commit=False est obligatoire ici, puisque cela évite que Django enregistre l'objet en base sans que vous ayez défini l'attribut code.

                          Dans notre solution, nous avons en réalité intégré la génération du code dans la méthode save. A la sauvegarde d'un objet MiniURL, on va d'abord vérifier si c'est un nouvel objet. Typiquement, un nouvel objet n'a pas encore de clé unique pk, alors qu'en cas de mis à jour, ce sera un nombre unique. Si c'est un nouvel objet donc, on lui assigne un nouveau code aléatoire, via self.generer.
                          Ensuite, on ne fait qu'appeler la méthode save "parent" (ligne 5 de votre extrait), qui va faire le travail habituel. De cette façon on a plus à utiliser commit=False, puisque l'on sait qu'un code sera attribué avant l'enregistrement.

                          Pour votre problème de formulaire, comment avez-vous initialisez le formulaire ? (vous êtes sûr que c'est simplement form= UrlForm() ?) Cela peut-être dû au navigateur qui pré-rempli les champs dû au formulaire précédent. Vous pouvez toujours tentez de faire request.POST = None si cela vous dérange.

                          • Partager sur Facebook
                          • Partager sur Twitter
                            26 décembre 2014 à 14:38:44

                            Je comprend mieux, la variable self contient en fait les données de mon formulaire précédemment rempli et je peux donc modifier ses données comme si je faisait un form.code. Par contre même avec l'exemple dans le cours j'ai du mal à déchiffrer ce qu'effectue la fonction super(), elle effectue la sauvegarde avec MiniUrl pour spécifier le modèle et le self contenant mes données à enregistrer, mais à quoi se rapporte les paramètre *args et **kwargs? Je pense qu'il y a des bases que je n'ai pas vraiment saisi, je vais aller relire ça.

                            Pour le formulaire, en fait quand je rempli le formulaire et envoi ma réponse je reviens sur la page avec le

                            return render(request, 'url/seturl.html', locals())

                            avec les champs préremplis de ma précédente saisie, j'ai donc inclus form= UrlForm() dans mon if afin de le formater. Après validation et enregistrement, je reviens bien sur la page avec un formulaire vide mais si j'actualise la page la précédente requête est regénérée, j'en conclu que les paramètres POST sont toujours actif, en soit ça ne me pose pas de problème ici car mon modèle est bien configurer pour avoir des adresses et code uniques donc pas de soucis si la requête est regénérée par erreur mais je voudrais savoir éviter ce comportement, pour une autre app comme un formulaire de contact par exemple.

                            Merci

                            -
                            Edité par V1ce 26 décembre 2014 à 14:47:21

                            • Partager sur Facebook
                            • Partager sur Twitter
                              27 décembre 2014 à 14:00:27

                              Bonjour,

                              La fonction super permet de récupérer la classe parente et donc d'appeler les méthodes de la classe mère (ici, on appelle la méthode save() de la classe Model, puisque tout modèle hérite de cette classe). J'ai regardé rapidement dans le cours Python d'OC et j'ai rien trouvé sur cette méthode super malheureusement ! La documentation anglaise explique très bien le sujet, mais voici également un sujet français avec quelques exemples.

                              Le *args et **kwargs permettent d'accepter un nombre "infini" d'éléments. args sera un tuple (liste non-modifiable) et kwargs un dictionnaire. Pour comprendre, voici un exemple rapide :

                              >>> def fct(*args):
                              ...      print(args)
                              ...
                              >>> fct(1, 2, 3)
                              (1, 2, 3)
                              >>> fct(1, 8, 0)
                              (1, 8, 0)
                              >>> def fct(*args, **kwargs):
                              ...     print("Elems dans kwargs", kwargs)
                              ...     print("Elems dans args", args)
                              ...
                              >>> fct(1,2,3)
                              ('Elems dans kwargs', {})
                              ('Elems dans args', (1, 2, 3))
                              >>> fct(1,2,3,min=12,max=24)
                              ('Elems dans kwargs', {'max': 24, 'min': 12})
                              ('Elems dans args', (1, 2, 3))
                              

                              Pour plus d'informations, recherchez l'opérateur splat de Python (c'est son petit nom anglais ^^). Dans notre cas ici, on prend tous les arguments potentiellement passé à la méthode save et on les renvoie tel quel à la méthode parente, pour ne pas en modifier son fonctionnement.

                              Ceci est de la syntaxe Python un peu avancé mais très utilisé dans Django pour un certain nombre d'opérations (et cela évite de devoir réécrire tous les paramètres de save si on ne s'en sert pas au final !)

                              Pour votre problème de POST, je viens de comprendre ! C'est un problème très récurrent en programmation web... Lorsque vous validez un formulaire sur un site web quelconque, le navigateur envoie une requête de type POST et le serveur vous renvoie une page. Hors, si vous faites F5, le navigateur va renvoyer la dernière requête, qui est ici notre requête POST... Ceci n'est pas dû à Django ni même à votre code : c'est le principe du réseau. Les navigateurs préviennent les utilisateurs (Via une petite alerte "Etes-vous sûr de vouloir reposter blabla ?") mais le moyen le plus efficace reste la redirection, comme vu en TP. 

                              La redirection va renvoyer l'utilisateur sur une nouvelle page. Le navigateur va alors "oublié" la requête POST et penser que la dernière requête est de type GET sur votre redirection (en simplifiant). Ainsi, l'utilisateur ne pourra plus renvoyer le formulaire via F5. Pour lui envoyer un message de succès, vous pourrez utiliser l'outil de messages intégré à Django, présenté dans un chapitre de la partie 4 :)

                              • Partager sur Facebook
                              • Partager sur Twitter
                                28 décembre 2014 à 10:11:49

                                Merci beaucoup pour cette réponse complète, j'ai pas encore tout saisie mais cela va venir, ce qui me gêne c'est de ne pas savoir extactement ce que contiennent mes variable self, *args et **kwargs ce qui m'empêche de voir clairement ce qu'effectue la fonction et je n'aime pas ça, mais pour le coup c'est juste des bases en python qu'il me manque.

                                J'ai découvert entre temps l'outil message, c'est beaucoup plus propre en effet.

                                Merci encore.

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  5 janvier 2015 à 13:26:53

                                  Bonjour tout le monde

                                  J'aimerai avoir un peu d'aide dans la partie trois du cours de Django

                                  from django.views.generic import CreateView
                                  from django.core.urlresolvers import reverse_lazy
                                  class URLCreate(CreateView):
                                      model = MiniURL
                                      template_name = 'mini_url/nouveau.html'
                                      form_class = MiniURLForm
                                      success_url = reverse_lazy(liste)

                                  Quel ligne permet de sauvegarder l'url dans la base de données car rien n'est ajouter dans la base de données.

                                  Merci d'avance les profs et etudiants pour votre aide

                                  Résolu :

                                  {% extends "base.html" %}
                                  {% block content %}
                                      <h1>Raccourcir une URL</h1>
                                      <form method="post" action="">
                                      {% csrf_token %}
                                      {{ form.as_p }}
                                          <p><input type="submit" value="Valider" /></p>
                                      </form>
                                  {% endblock %}

                                  action="" ou lieu de action="." quelle est la différence ???

                                  et cette ligne

                                  from django.views.generic.edit import CreateView





                                  -
                                  Edité par luckyfof 5 janvier 2015 à 13:48:27

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    5 janvier 2015 à 21:40:19

                                    Bonsoir,

                                    Tout d'abord, la question la plus simple, à propos de l'import :

                                    from django.views.generic.edit import CreateView
                                    from django.views.generic import CreateView

                                    Ces deux lignes sont équivalentes pour vous. La seconde est en réalité un raccourci du premier, possible grâce aux fichiers __init__.py en Python. Vous pouvez le constater par vous même ici.

                                    Ensuite, la différence entre action="" et action=".". Je dois l'avouer, je n'ai jamais cherché bien loin l'explication, mais il me semble que cela est dû au fait que "." fait perdre la tête à certains navigateurs. Parfois, cela redirige vers la base de l'URL (par exemple, openclassrooms.com/login vers openclassrooms.com...)
                                    En théorie, on devrait ne pas mettre l'argument action quand celui-ci est vide pour être valide HTML5. Cependant certains vieux navigateurs plantent également quand on l'omet (de plus, des parties du cours ont été écrit quand le HTML5 n'était pas aussi démocratisé) ! Bref, aujourd'hui, ce qui est sûr c'est que action="", ça marche ^^

                                    Bonne année et bonne soirée :)

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      12 janvier 2015 à 14:37:30

                                      Bonjour tout le monde

                                      Pour utiliser Memcached dans Django, j'ai du installer le module suivant :

                                      pip3.4 python3-memcached

                                      Je suis sur la version python3.4 et Django 1.7

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        16 janvier 2015 à 9:38:20

                                        bonjour,

                                        j'ai une ptite question concernant les relations avec django dans le cas d'une base déjà existante???

                                        je ne vois que des exercices avec lesquelles on fait des ajouts dans une base vide.. dans le cas par exemple de relations multiples et l'utilisation de django sur base existante ou il existe déjà des champs de jointure qui peuvent être des champs texte.... comment cela se passe? l'ajout d'un paramètre " models.ManyToManyField" à un champ déjà existant d'une table suffit il? car j'ai essayé mais sans résultat mais j'ai peut être loupé quelque chose??

                                        merci votre aide

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          18 janvier 2015 à 10:49:31

                                          Bonjour,

                                          Qu'entendez-vous par base existante ? Si vous souhaitez utiliser une base de données crées précédemment sans Django, c'est possible. Tout d'abord, vous pouvez générer tous vos modèles automatiquement avec la commande

                                          python manage.py inspectdb
                                          
                                          # Pour l'enregistrer dans un fichier directement
                                          python manage.py inspectdb > models.py


                                          Cela va créer des tables ressemblant à ceci :

                                          class Article(models.Model):
                                              id = models.IntegerField(primary_key=True)
                                              titre = models.CharField(max_length=70)
                                              contenu = models.TextField()
                                          
                                          
                                              class Meta:
                                                 managed = False
                                                 db_table = 'matable_article'

                                          L'attribut managed de Meta est mis à False par défaut pour que Django ne modifie pas cette table en cas de modifications du modèle. Si vous comptez mettre à jour votre table, vous pouvez le passer à True ou même retirer cette ligne. Ensuite, l'attribut db_table permet de spécifier à Django vers quelle table pointe ce modèle. Par défaut, lorsque Django crée lui même les tables, il se débrouille pour avoir une convention. En l'occurence <nom_app>_<nom_modele>, tout en minuscules.

                                          Pour votre relation ManyToMany, vous pouvez reconstruire un modèle calquant votre table et faire votre relation avec ce premier.

                                          Références :

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            19 janvier 2015 à 10:26:13

                                            merci :-)... c'est exactement ce que je cherchais...; 

                                            "Pour votre relation ManyToMany, vous pouvez reconstruire un modèle calquant votre table et faire votre relation avec ce premier."

                                            C'est à ce niveau que ce n'est pas trop clair pour moi. J'ai deux tables sur oracle qui contiennent déjà des données. Il existe les champs de relation sur chaque table. si je comprend bien j'ai juste à utiliser inspectdb pour créer automatiquement mon model.py puis à le modifier et à rajouter un champ ManyToMany et l'argumentthrough ne sera pas utiliser? si je reprends votre exemple dans le tuto>>

                                            la table vendeur aurait un champ>> produits = models.ManyToManyField(Produit) et django s'occuperait tt seul de la création de la troisième table (je n'ai pas de champ à ajouter) avec les deux clés étrangéres??

                                            merci de votre aide

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              19 janvier 2015 à 21:38:43

                                              Si vous retirez le managed = False, oui, il créera une troisième table pour stocker les différentes associations, en utilisant la clé primaire (id plus haut par exemple) pour la clé étrangère.

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                21 janvier 2015 à 11:35:06

                                                ok merci beaucoup..

                                                du coup j'ai lancé un inspectdb et il m'a bien créée tt mes modeles (vraiment puisssant)..

                                                Par contre je me suis rendu compte qu'il ne prenait pas les vues de oracle et que même en créant un modeles pour cette vue il ne trouvait pas la table... il y a un moyen de travailler avec les vues défini dans oracle???

                                                merci

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  1 février 2015 à 20:33:58

                                                  bonjour j'ai un projet qui consiste à récupérer les informations sur un robot concours avec python . mais mon problème est que je dois le faire en wifi avec la shield wifi rn171 et je ne sais pas comment le récupérer , je sais le faire en usb . 

                                                  je demande votre aide 

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    2 février 2015 à 10:33:13

                                                    Bonjour Mohameddiakite1,

                                                    Cette question ne semble pas lié à Django mais plus à du Python de manière générale. Merci de créer votre propre sujet mais avec plus de détails ;)

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      2 février 2015 à 11:50:50

                                                      Bonjour Mr. le professeur Ssx`z, je suis arrivé au bout de ma formation Django - 1.7.

                                                      J'aimerai avoir votre avis sur mon model de Mini Réseau. Pour avoir une idée d'amélioration dans l'avenir.
                                                      Merci d'avance pour votre aide précieuse durant cette période de formation.
                                                      Ca été un régal pour moi...

                                                      Model du Mini Réseau

                                                      from django.db import models
                                                      from django.contrib.auth.models import User
                                                      
                                                      # Création d'un model profil hérité de User
                                                      class Profil(models.Model):
                                                          user = models.OneToOneField(User)
                                                          avatar = models.ImageField(null=True, blank=True, upload_to="avatars/", default='avatars/default.png')
                                                      
                                                          def __str__(self):
                                                              return "Profil de {0}".format(self.user.username)
                                                      
                                                      # Création du model Message
                                                      class Message(models.Model):
                                                          profil = models.ForeignKey('Profil', related_name='id_du_profil')
                                                          msg = models.TextField()
                                                          mur = models.ForeignKey('Profil', related_name='id_du_mur')
                                                          date_msg = models.DateTimeField(auto_now_add=True, auto_now=False, verbose_name="Date du Message")
                                                      
                                                          def __str__(self):
                                                              return "Message de {0}, du {1}".format(self.profil.user.username, self.date_msg)
                                                      
                                                          def commentaires(self):
                                                              return self.commentaire_set.filter(msg_id=self.pk)
                                                      
                                                      # Création d'un model commentaire
                                                      class Commentaire(models.Model):
                                                          comment = models.TextField()
                                                          msg = models.ForeignKey('Message')
                                                          date_cmt = models.DateTimeField(auto_now_add=True, auto_now=False, verbose_name="Date du commentaire")
                                                          pseudo = models.CharField(max_length=30)
                                                      
                                                          def __str__(self):
                                                              return "Commentaire"
                                                      

                                                      Vue du Mini Réseau

                                                      from django.shortcuts import render, redirect, get_object_or_404
                                                      from django.http import HttpResponse
                                                      from django.contrib.auth import authenticate, login, logout
                                                      from django.core.urlresolvers import reverse
                                                      from django.contrib.auth.decorators import login_required
                                                      from .forms import ConnexionForm, CommentaireForm
                                                      from .models import Message, Profil
                                                      
                                                      # Fonction de login
                                                      def connexion(request):
                                                          error = False
                                                      
                                                          if request.method == "POST":
                                                              form = ConnexionForm(request.POST)
                                                              if form.is_valid():
                                                                  username = form.cleaned_data['username']
                                                                  password = form.cleaned_data['password']
                                                                  user = authenticate(username=username, password=password)
                                                                  if user:
                                                                      login(request, user)
                                                                      return redirect(home)
                                                                  else:
                                                                      error = True
                                                          else:
                                                              form = ConnexionForm()
                                                      
                                                          return render(request, 'social/connexion.html', locals())
                                                      
                                                      # Fonction de logout
                                                      def deconnexion(request):
                                                          logout(request)
                                                          return redirect(reverse(connexion))
                                                      
                                                      # Fonction page du profil
                                                      @login_required
                                                      def home(request):
                                                          if request.user.is_authenticated():
                                                              messages = Message.objects.filter(mur_id=request.user.id).order_by('-date_msg',)
                                                              if request.method == "POST":
                                                                  form = CommentaireForm(request.POST)
                                                                  if form.is_valid():
                                                                      # On recupère le champs masqué pour savoir à quel message appartient le commentaire
                                                                      # Faille possible
                                                                      cmt = form.save(commit=False)
                                                                      cmt.msg_id = int(request.POST['msg'])
                                                                      cmt.pseudo = request.POST['pseudo']
                                                                      cmt.save()
                                                                      form = CommentaireForm()
                                                              else:
                                                                  form = CommentaireForm()
                                                              return render(request, 'social/home.html', locals())
                                                          return redirect(reverse(connexion))
                                                      
                                                      # Fonction voir profil d'un profil par ID
                                                      # Repétition du code en contradiction avec l'esprit DRY
                                                      @login_required
                                                      def voir(request, user_id):
                                                          perso = get_object_or_404(Profil, user_id=user_id)
                                                          messages = Message.objects.filter(mur_id=user_id).order_by('-date_msg',)
                                                          if request.method == "POST":
                                                                  form = CommentaireForm(request.POST)
                                                                  if form.is_valid():
                                                                      # On recupère le champs masqué pour savoir à quel message appartient le commentaire
                                                                      # Faille possible
                                                                      cmt = form.save(commit=False)
                                                                      cmt.msg_id = int(request.POST['msg'])
                                                                      cmt.pseudo = request.POST['pseudo']
                                                                      cmt.save()
                                                                      form = CommentaireForm()
                                                          else:
                                                              form = CommentaireForm()
                                                          return render(request, 'social/voir.html', locals())
                                                      
                                                      
                                                      



                                                      -
                                                      Edité par luckyfof 2 février 2015 à 12:08:41

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        4 février 2015 à 10:13:22

                                                        Bonjour !

                                                        Désolé pour le temps de réponse, le prof aussi est en exams ^^

                                                        Tout d'abord, je vois que la consigne d'utiliser l'héritage dans les modèles n'a pas été respecté. Dans cette dernière activité, on s'attendait à ce que vous créez 2 modèles pour les messages : Message qui concerne ceux poster de façon général, et MessageVersAmi, par exemple, qui concerne spécifiquement ceux poster sur le mur d'un ami. Ici vos messages sont forcément sur le mur d'une autre personne.

                                                        Le but était de vous faire manier un peu de requêtes complexes, du genre (extrait de ma correction) :

                                                        posts = Post.objects.filter(Q(auteur=user, postami__isnull=True)
                                                                                        | Q(postami__destinataire=user))


                                                        Mes modèles s'appellent Post et PostAmi. Ici on récupère tous les posts fait par une personne ET ceux sont il est le destinataire, à l'image des profils sur Facebook.

                                                        Pour le reste ça semble propre, même si je ne comprends pas trop d'où sort ce "cmt.msg_id". (ligne 45 et 66 des views). De plus, le pseudo dans les commentaires pourraient être remplacés par une ForeignKey vers User directement

                                                         Par ailleurs, on a jamais parlé dans le cours, mais voici quelques conseils (en Français) pour l'utilisation des users dans les modèles, si vous souhaitez un jour faire des applications réutilisables : Références au modèle utilisateur ;)

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          4 février 2015 à 15:16:52

                                                          Bonjour !

                                                          Je me permet de joindre un schema des rélations entre mes différentes tables...

                                                          Monsieur le professeur, j'aimerai avoir de votre part le schéma des relations entre vos tables.
                                                          Pour comprendre votre logique merci beaucoup, pour votre aide précieuse...

                                                          -
                                                          Edité par luckyfof 5 février 2015 à 9:09:36

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            17 mars 2015 à 9:42:14

                                                            bonjour a tous,

                                                            Est-ce que le logiciel Django la seule logiciel compatible avec le langage python?


                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              20 mars 2015 à 21:22:09

                                                              Bonjour,

                                                              Django n'est pas un logiciel mais un framework permettant le développement de site web avec le langage Python. Il en existe d'autres pour ce langage : Flask, web2py, TurboGears... De la même façon, il en existe en PHP (Symfony2), en Ruby (RoR)...

                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              Exercices du cours Django / Vos questions

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              • Editeur
                                                              • Markdown